从pandas列中的日期字符串列中提取年份

时间:2015-09-22 19:27:53

标签: python datetime pandas

我有一个包含日期列的数据集:

df.faultDate.head()

0    2014-07-13
1    2014-07-13
2    2014-07-12
3    2014-07-12
4    2014-07-13

我试图从中获得几年。

dt.datetime.strptime(df.faultDate[0], '%Y-%m-%d').year

2014

可是:

df.faultDate.apply(dt.datetime.strptime, args=('%Y-%m-%d'))

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-bca0dc79125b> in <module>()
----> 1 df.faultDate.apply(dt.datetime.strptime, args=('%Y-%m-%d'))

/home/shiny/anaconda3/lib/python3.4/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   2058             values = lib.map_infer(values, lib.Timestamp)
   2059 
-> 2060         mapped = lib.map_infer(values, f, convert=convert_dtype)
   2061         if len(mapped) and isinstance(mapped[0], Series):
   2062             from pandas.core.frame import DataFrame

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:58435)()

/home/shiny/anaconda3/lib/python3.4/site-packages/pandas/core/series.py in <lambda>(x)
   2047 
   2048         if kwds or args and not isinstance(func, np.ufunc):
-> 2049             f = lambda x: func(x, *args, **kwds)
   2050         else:
   2051             f = func

TypeError: strptime() takes exactly 2 arguments (9 given)

在成功将字符串转换为日期时间之后,我也不确定如何传递.year参数。我可以编写一个包装函数,将每行作为输入,然后提取年份,但我认为知道如何应用pandas语法以供将来参考是有用的。谢谢!

2 个答案:

答案 0 :(得分:3)

方法#1(更好,恕我直言):将其视为日期解析问题,之后我们可以使用.dt向量化时间访问器。

>>> pd.to_datetime(df.faultDate).dt.year
0    2014
1    2014
2    2014
3    2014
4    2014
dtype: int64

我们可以根据需要指定格式:

>>> pd.to_datetime(df.faultDate, format="%Y-%m-%d").dt.year
0    2014
1    2014
2    2014
3    2014
4    2014
dtype: int64

方法#2:将其视为字符串解析问题。在某些方面不太自然,但作为在其他场合可以派上用场的技巧的一个例子,也不错。我们可以使用矢量化字符串操作:

>>> df.faultDate.str[:4].astype(int)
0    2014
1    2014
2    2014
3    2014
4    2014
Name: faultDate, dtype: int64
>>> df.faultDate.str.split("-").str[0].astype(int)
0    2014
1    2014
2    2014
3    2014
4    2014
dtype: int64

答案 1 :(得分:0)

我认为您需要的是调用实际对象,而不是整个文件:

dt.datetime.strptime(df.faultDate[0], '%Y-%m-%d').year

变成

(df.faultDate[0]).apply(dt.datetime.strptime, args=('%Y-%m-%d’))

注意下标!