Pandas to_datetime不一致的转换



下面是演示这个问题的MRE:

a = pd.DataFrame({'date': ['2021-01-01 00:00:00+1:00', '2021-01-01 00:00:01+1:00']}) 
b = pd.DataFrame({'date': ['2021-01-01 00:00:00+1:00', '2021-01-01 00:00:01+2:00']}) 
a['date'] = pd.to_datetime(a.date)
b['date'] = pd.to_datetime(b.date)
a.date.iloc[-1]
# gives Timestamp('2021-01-01 00:00:01+0100', tz='pytz.FixedOffset(60)')
b.date.iloc[-1]
# datetime.datetime(2021, 1, 1, 0, 0, 1, tzinfo=tzoffset(None, 7200))

因此a具有来自同一时区的日期时间字符串并被转换为时间戳,b具有来自两个不同时区的日期时间字符串并被转换为日期时间。datetime对象。

这是一个问题,因为我想在像b这样的DataFrame上使用.dt访问器来转换时区,但是这个(明显的)错误阻止了我。

您得到的问题是a['date']很可能被存储为后台的适当数组。而b['date']是不同类型的,必须存储为不同类型的列表。

一种方法是使用utc=True参数:
pd.to_datetime(b.date, utc=True)

https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html

下面是一些测试代码:
a['date'] = pd.to_datetime(a.date, utc=True)
b['date'] = pd.to_datetime(b.date, utc=True)
aval = a.date.iloc[-1]
print(aval)
print(type(aval))
print(a['date'].dt)
print(a['date'])
bval = b.date.iloc[-1]
print(bval)
print(type(bval))
print(b['date'].dt)
print(b['date'])

输出:

2020-12-31 23:00:01+00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
<pandas.core.indexes.accessors.DatetimeProperties object at 0x7f4aa41f3c40>
0   2020-12-31 23:00:00+00:00
1   2020-12-31 23:00:01+00:00
Name: date, dtype: datetime64[ns, UTC]
2020-12-31 22:00:01+00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
<pandas.core.indexes.accessors.DatetimeProperties object at 0x7f4aa41f3b20>
0   2020-12-31 23:00:00+00:00
1   2020-12-31 22:00:01+00:00
Name: date, dtype: datetime64[ns, UTC]

但是要确保正确地转换到UTC,即UTC时间戳在给定时区的情况下被适当地调整。我没有检查。

最新更新