26

我在 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 日的日期时间对象,但 30/01/2012 转换为 2012 年 1 月 30 日,这正是我想要的。

看了这个问题后,我尝试了:

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

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

4

2 回答 2

26

您可以在读取数据时使用parse_datesfrom 选项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
于 2013-05-21T14:25:47.973 回答
15

我认为您正确调用它,我将其作为问题发布在 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(这比指定确切的格式更容易),因为dayfirstis not strict

于 2013-05-21T14:51:02.790 回答