我在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表明我做得对,所以我很茫然。有谁知道我做错了什么?
答案 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。