这是我的例子:
import pandas as pd
import datetime
my_df = pd.DataFrame({'date_clmn': [datetime.date(2020, 1, 1),
datetime.date(2020, 2, 1),
datetime.date(2020, 3, 1)]})
my_df['lag_date'] = my_df.date_clmn - pd.DateOffset(months = 3)
my_df.lag_date.dt.date
最后一行生成错误:
AttributeError: Can only use .dt accessor with datetimelike values
据我了解
dt
访问器应该使用时间戳。为什么会产生错误消息?
更新
为了确认我运行的数据类型:
my_df.lag_date.apply(type)
它回来了:
0 <class 'pandas._libs.tslibs.timestamps.Timesta...
1 <class 'pandas._libs.tslibs.timestamps.Timesta...
2 <class 'pandas._libs.tslibs.timestamps.Timesta...
Name: lag_date, dtype: object
我认为
date
s正在转换为datetimes
,但在循环中,所以最终没有创建TimeSeries
,而是创建Timestamp
s的对象。
my_df['lag_date'] = my_df.date_clmn - pd.DateOffset(months = 3)
print (my_df.lag_date.apply(type))
0 <class 'pandas._libs.tslibs.timestamps.Timesta...
1 <class 'pandas._libs.tslibs.timestamps.Timesta...
2 <class 'pandas._libs.tslibs.timestamp
可能的解决方案是先将
dates
s 转换为 datetime
s:
my_df['lag_date'] = pd.to_datetime(my_df.date_clmn) - pd.DateOffset(months = 3)
print (my_df.lag_date.dt.date)
0 2019-10-01
1 2019-11-01
2 2019-12-01
Name: lag_date, dtype: object
或最后一个:
my_df['lag_date'] = pd.to_datetime(my_df.date_clmn - pd.DateOffset(months = 3))
print (my_df.lag_date)
0 2019-10-01
1 2019-11-01
2 2019-12-01
Name: lag_date, dtype: datetime64[ns]