如何正确合并含不同时区时间列的Pandas DataFrame?
解决带时区的DataFrame合并匹配问题
问题核心是两个DataFrame的tsr列时区不同——哪怕它们代表同一绝对时刻,不同的时区标记也会让Pandas判定为不同值,导致merge时无法匹配。完全不需要转成字符串合并,统一两个时间列的时区才是正确做法。
解决步骤
1. 统一时区
把其中一个DataFrame的时间列转换为和另一个相同的时区,二选一即可:
- 方案一:将df2的时间转为UTC时区(和df1一致)
import pandas as pd # 转换df2的tsr到UTC时区 df2["tsr"] = df2["tsr"].dt.tz_convert("UTC") # 基于统一后的tsr列合并 merged_df = pd.merge(df1, df2, on="tsr")
- 方案二:将df1的时间转为Pacific/Auckland时区(和df2一致)
import pandas as pd # 转换df1的tsr到Pacific/Auckland时区 df1["tsr"] = df1["tsr"].dt.tz_convert("Pacific/Auckland") # 基于统一后的tsr列合并 merged_df = pd.merge(df1, df2, on="tsr")
2. 为什么不建议转字符串?
转字符串虽然可能临时解决匹配问题,但存在明显弊端:
- 若时间字符串格式存在细微差异(比如时区显示格式不同),会直接导致匹配失败;
- 丢失datetime类型的特性,后续无法直接进行时间加减、按时间段筛选等操作。
验证匹配结果
统一时区后,Pandas会正确识别同一绝对时刻的时间值,合并后就能得到你期望的对应关系:
2021-10-01 00:30:00+00:00 2021-10-01 00:30:00+13:00 2021-10-01 01:00:00+00:00 2021-10-01 01:00:00+13:00 2021-10-01 01:30:00+00:00 2021-10-01 01:30:00+13:00 2021-10-01 02:00:00+00:00 2021-10-01 02:00:00+13:00
内容的提问来源于stack exchange,提问作者Yiffany
相关产品推荐
相关产品推荐

