使用 dt 访问器将 Pandas 中的时间戳转换为日期时出错

问题描述 投票:0回答:1

这是我的例子:

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
pandas datetime timestamp
1个回答
0
投票

我认为

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]
© www.soinside.com 2019 - 2024. All rights reserved.