如何移除Pandas DataFrame所有datetime列的时区信息
Pandas统一移除所有datetime列时区信息的解决方案
报错原因说明
直接对全列调用tz_convert(None)报错,是因为本身不带时区的datetime列(tz-naive)不支持该方法,需要先过滤或判断。
无需自定义函数的实现方案
方案1:单行lambda全列处理
直接将判断逻辑整合到lambda中,适配所有列类型:
data = data.apply(lambda x: x.dt.tz_convert(None) if pd.api.types.is_datetime64_any_dtype(x) and x.dt.tz is not None else x)
该写法会自动跳过非datetime列、以及本身不带时区的datetime列,无需额外处理。
方案2:筛选datetime列批量处理(性能更优)
适合列数较多、数据量较大的场景,仅遍历datetime列处理:
# 筛选所有datetime类型列 dt_cols = data.select_dtypes('datetime64').columns # 批量处理带时区的列 data[dt_cols] = data[dt_cols].apply(lambda x: x.dt.tz_convert(None) if x.dt.tz else x)
方案3:astype直接转换(最简洁)
直接将所有datetime列转为无时区的datetime64[ns]类型,自动完成时区移除:
dt_cols = data.select_dtypes('datetime64').columns data[dt_cols] = data[dt_cols].astype('datetime64[ns]')
注意:上述方法默认行为与
tz_convert(None)一致,会先将带时区的时间转换为UTC时间后再移除时区属性。如果需要保留原时间数值仅抹除时区标识,将tz_convert(None)替换为dt.tz_localize(None)即可。
内容的提问来源于stack exchange,提问作者Nerxis
相关产品推荐
相关产品推荐

