Pandas to_datetime多时区转换不一致导致dt访问器不可用问题
问题原因
pandas 底层的datetime64[ns, tz]类型仅支持同列所有时间使用同一个时区,因此当输入的时间字符串包含不同时区偏移时,pd.to_datetime只能降级返回object类型数组,存储Python原生datetime.datetime对象,自然无法使用.dt访问器。
解决方案
分为两种场景处理:
场景1:可统一所有时间到相同时区(推荐)
将所有时间转换为同一个时区后,即可转回pandas标准的带时区datetime类型,正常使用所有向量化时间操作和.dt访问器,性能远高于逐行处理。
示例代码:
import pandas as pd b = pd.DataFrame({'date': ['2021-01-01 00:00:00+1:00', '2021-01-01 00:00:01+2:00']}) b['date'] = pd.to_datetime(b.date) # 示例统一转换为UTC时区,可替换为你需要的目标时区 b['date_unified'] = b['date'].apply(lambda x: x.astimezone(pd.UTC)).astype('datetime64[ns, UTC]') # 此时可正常使用.dt访问器 print(b['date_unified'].dt.hour)
场景2:必须保留各时间原有不同时区
只能保持object类型存储原生datetime对象,所有时间操作通过apply逐行处理:
示例代码:
# 示例提取每个时间的本地小时数 b['local_hour'] = b['date'].apply(lambda x: x.hour) # 示例转换为指定格式字符串 b['date_str'] = b['date'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
注意:不要尝试强行将多时区的datetime列转换为pandas datetime类型,会导致时区信息丢失或转换错误
内容的提问来源于stack exchange,提问作者Cameron Chandler
相关产品推荐
相关产品推荐

