我有一个包含日期列的数据集:
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语法以供将来参考是有用的。谢谢!
答案 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’))
注意下标!