使用pandas.to_datetime进行转换时指定日期格式

时间:2013-05-21 14:12:22

标签: python datetime pandas

我在csv文件中有数据,日期存储为标准英国格式的字符串 - %d/%m/%Y - 意味着它们看起来像:

12/01/2012
30/01/2012

以上示例代表2012年1月12日和2012年1月30日。

当我使用pandas版本0.11.0导入此数据时,我应用了以下转换:

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

但它不一致地转换日期。要使用我现有的示例,12/01/2012将转换为代表2012年12月1日的日期时间对象,但2012年1月30日转换为2012年1月30日,这就是我想要的。

看了this question我试过了:

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

但结果完全一样。 source code表明我做得对,所以我很茫然。有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:20)

您可以使用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

答案 1 :(得分:10)

我认为您正确地调用了它,我将其发布为an issue on 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 isn't strict