2013-04-05 3 views
2

Я искал в форумах и не могу решить следующую проблему. Я очень новичок в python с небольшим опытом программирования, поэтому моя проблема может быть тривиальной.Получить генератор genfromtxt для Numpy для использования функции def

Желательно преобразовать дату-время в формат даты и времени с использованием date.strptime classmethod.

Проблема заключается в формате строки внутри столбца не соответствует (большинство из них: %Y-%m-%d $H:$M:$S.%f); когда время падает ровно на второе, миллисекундные десятичные числа опущены (формат должен быть вместо %Y-%m-%d $H:$M:$S). Когда strptime встречает непризнанный формат, он просто поместит в элемент массива значение None.

Есть ли способ, чтобы создать исключение в lambda функции (то есть, ValueError исключения), если нет, то как я могу передать значение строки в «нормальной» def timeConv(x) функции от варианта genfromtxt преобразователя?

Возможно, есть лучший способ приблизиться к этой проблеме ...?

Мой текущий код, который приводит к значению None, когда формат %Y-%m-%d $H:$M:$S:

timeConv = lambda x: datetime.strptime(x, '\"%Y-%m-%d $H:$M:$S.%f\"') 

Time = np.genfromtxt(file, dtype='object', delimiter=',', skip_header=4, usecols=(0), converters = {0: timeConv}) 
+0

fyi, 'f = lambda x, y: <делать вещи с x, y>' то же самое, что 'def f (x, y): <делать вещи с x, y>' и обе дают имя ' f' к функции '<...>' – askewchan

ответ

4

Вы можете использовать try..except сначала попробовать один формат, и если он не работает, поймать исключение и попробовать другой формат:

import datetime as DT 
import numpy as np 

def timeConv(x): 
    try: 
     return DT.datetime.strptime(x, '%Y-%m-%d %H:%M:%S.%f') 
    except ValueError as err: 
     return DT.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') 

time = np.genfromtxt(file, dtype='object', delimiter=',', skip_header=4, 
        usecols=(0), converters = {0: timeConv}) 

функция, timeConv передается genfromtxt так же, как вы прошли lambda.


dateutil module имеет дату строки парсер, который не требует от вас, чтобы указать точный формат строки даты. Таким образом, используя dateutil вы могли бы просто написать

import dateutil.parser as dparser 
import numpy as np 

time = np.genfromtxt(file, dtype='object', delimiter=',', skip_header=4, 
        usecols=(0), converters = {0: dparser.parse}) 

Обратите внимание, что хотя dparser.parse очень проста в использовании, есть некоторые неоднозначные даты строки, как 2013-8-9 (8 августа или Sept 9?), Которые требуют большего ухода. Обязательно прочтите параметры dayfirst и yearfirst, чтобы вы могли управлять поведением парсера.

+0

Большое спасибо! Первый раздел кода работал как шарм. Кроме того, спасибо, что сообщили мне о dateutil.parser, я не знал, что это существовало. ура-А –

Смежные вопросы