2015-09-15 2 views
1

Я пытаюсь преобразовать столбец строк DateTime в Pandas-приемлемый формат Datetime. Конечно, я уже поиграл в Google и попробовал несколько решений. Convert Pandas Column to DateTimeConvert Pandas Column to DateTime II

Это один из самых обнадеживающих для меня, но оба рекомендуемых способа не работали для моего набора данных. Подробности: Название: Dataset совместно,

Колонка: индекс-колонка,

Формат: 15.07.2015 24:00 без большего количества Blancs до или после.

Мои усилия:

co['newdate'] = pd.to_datetime(co.index, format='%d.%m.%Y %H:%M') 

Следующий один я пытался после того как я преобразовал Index-седловины к "нормальной" колонке под названием "Datum"

co['newdate'] = co['Datum'].apply(lambda x: dt.datetime.strptime(x,'%d.%m.%Y %H:%M')) 

Ошибка: данные времени '15 .07 .2015 24:00 'не соответствует формату'% d.% M.% Y% H:% M '

эта ошибка возникает в обоих решениях. Любая идея?

+2

'24' не является допустимым часовым компонентом, его необходимо установить в' 0' 'pd.to_datetime ('15 .07.2015 23:00', format = '% d.% M.% Y% H:% M') 'будет работать, но' pd.to_datetime ('15 .07.2015 24:00', format = '% d.% m.% Y% H:% M') 'не будет – EdChum

ответ

2

Ваша строка формата является правильным, но ваши данные не, 24 не является допустимым час компонент, следовательно, ошибка:

In [138]: 

pd.to_datetime('15.07.2015 24:00', format = '%d.%m.%Y %H:%M') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tseries\tools.py in _convert_listlike(arg, box, format) 
    329    try: 
--> 330     values, tz = tslib.datetime_to_datetime64(arg) 
    331     return DatetimeIndex._simple_new(values, None, tz=tz) 

pandas\tslib.pyx in pandas.tslib.datetime_to_datetime64 (pandas\tslib.c:23823)() 

TypeError: Unrecognized value type: <class 'str'> 

During handling of the above exception, another exception occurred: 

ValueError        Traceback (most recent call last) 
<ipython-input-138-1546fb6950f0> in <module>() 
----> 1 pd.to_datetime('15.07.2015 24:00', format = '%d.%m.%Y %H:%M') 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tseries\tools.py in to_datetime(arg, errors, dayfirst, utc, box, format, exact, coerce, unit, infer_datetime_format) 
    343   return _convert_listlike(arg, box, format) 
    344 
--> 345  return _convert_listlike(np.array([ arg ]), box, format)[0] 
    346 
    347 class DateParseError(ValueError): 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tseries\tools.py in _convert_listlike(arg, box, format) 
    331     return DatetimeIndex._simple_new(values, None, tz=tz) 
    332    except (ValueError, TypeError): 
--> 333     raise e 
    334 
    335  if arg is None: 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tseries\tools.py in _convert_listlike(arg, box, format) 
    305      try: 
    306       result = tslib.array_strptime(
--> 307        arg, format, exact=exact, coerce=coerce 
    308      ) 
    309      except (tslib.OutOfBoundsDatetime): 

pandas\tslib.pyx in pandas.tslib.array_strptime (pandas\tslib.c:39900)() 

ValueError: time data '15.07.2015 24:00' does not match format '%d.%m.%Y %H:%M' (match) 

пока 23:59 разбирает прекрасно

In [139]: 
pd.to_datetime('15.07.2015 23:59', format = '%d.%m.%Y %H:%M') 

Out[139]: 
Timestamp('2015-07-15 23:59:00') 

Вы должны заменить 24 с использованием 0 для проведения анализа:

In [140]: 
pd.to_datetime('15.07.2015 00:00', format = '%d.%m.%Y %H:%M') 

Out[140]: 
Timestamp('2015-07-15 00:00:00') 

Так что вы можете сделать, это вызвать vectorised str.replace исправить эти странствующий час значения:

In [144]: 
df = pd.DataFrame({'date':['15.07.2015 24:00']}) 
print(df) 
df['date'] = df['date'].str.replace('24:','00:') 
print(df) 
pd.to_datetime(df['date'], format = '%d.%m.%Y %H:%M') 

       date 
0 15.07.2015 24:00 
       date 
0 15.07.2015 00:00 
Out[144]: 
0 2015-07-15 
Name: date, dtype: datetime64[ns] 

Так что в вашем случае вы можете сделать:

co.index = co.index.str.replace('24:','00:') 

, а затем преобразовывают, как и прежде

+0

wow, что i s удивительно элегантный. однако это не совсем правильно, поскольку 15.07.2015 24:00 на самом деле 16.07.2015 00:00 - означает полночь следующего дня – Robert

+0

Я конвертирую в '00: 00' или' 23: 59', а затем добавляю день/мин до этих строк – EdChum