Подтвердить что ты не робот

Указание формата даты при преобразовании с помощью pandas.to_datetime

У меня есть данные в файле csv с датами, хранящимися как строки в стандартном формате Великобритании - %d/%m/%Y - они выглядят так:

12/01/2012
30/01/2012

Приведенные выше примеры представлены 12 января 2012 года и 30 января 2012 года.

Когда я импортирую эти данные с помощью pandas версии 0.11.0, я применил следующее преобразование:

import pandas as pd
...
cpts.Date = cpts.Date.apply(pd.to_datetime)

но он преобразовывал даты непоследовательно. Чтобы использовать мой существующий пример, 12/01/2012 будет конвертироваться как объект datetime, представляющий 1 декабря 2012 года, но 30/01/2012 преобразуется с 30 января 2012 года, и это то, что я хочу.

Посмотрев этот вопрос, я попытался:

cpts.Date = cpts.Date.apply(pd.to_datetime, format='%d/%m/%Y')

но результаты точно такие же. Исходный код говорит, что я делаю все правильно, поэтому я в недоумении. Кто-нибудь знает, что я делаю неправильно?

4b9b3361

Ответ 1

Вы можете использовать параметр parse_dates из read_csv, чтобы сделать преобразование напрямую при чтении данных.
Трюк здесь состоит в том, чтобы использовать dayfirst=True, чтобы указать, что ваши даты начинаются с дня, а не месяца. См. Здесь для получения дополнительной информации: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.parsers.read_csv.html

Когда ваши даты должны быть индексом:

>>> import pandas as pd
>>> from StringIO import StringIO
>>> s = StringIO("""date,value
... 12/01/2012,1
... 12/01/2012,2
... 30/01/2012,3""")
>>> 
>>> pd.read_csv(s, index_col=0, parse_dates=True, dayfirst=True)
            value
date             
2012-01-12      1
2012-01-12      2
2012-01-30      3

Или когда ваши даты находятся в определенном столбце:

>>> s = StringIO("""date
... 12/01/2012
... 12/01/2012
... 30/01/2012""")
>>> 
>>> pd.read_csv(s, parse_dates=[0], dayfirst=True)
                 date
0 2012-01-12 00:00:00
1 2012-01-12 00:00:00
2 2012-01-30 00:00:00

Ответ 2

Я думаю, что вы правильно его называете, и я опубликовал это как проблему github.

Вы можете просто указать формат to_datetime напрямую, например:

In [1]: s = pd.Series(['12/1/2012', '30/01/2012'])

In [2]: pd.to_datetime(s, format='%d/%m/%Y')
Out[2]:
0   2012-01-12 00:00:00
1   2012-01-30 00:00:00
dtype: datetime64[ns]

Обновление: как правильно указывает OP, это не работает с NaN, если вы довольны dayfirst=True (который также работает с NaN):

s.apply(pd.to_datetime, dayfirst=True)

Стоит отметить, что нужно быть осторожным, используя dayfirst (что проще, чем указание точного формата), поскольку dayfirst не является строгим.