Указание формата даты при преобразовании с помощью 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')
но результаты точно такие же. Исходный код говорит, что я делаю все правильно, поэтому я в недоумении. Кто-нибудь знает, что я делаю неправильно?
Ответы
Ответ 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
не является строгим.