Pandas使用fillna(value=dict)时丢失时区信息是否为预期行为?
pandas.fillna使用字典参数时区丢失是否为预期行为?
在Python 3.10.8、pandas 1.4.4环境下执行以下代码:
from datetime import datetime, timezone import pandas print(pandas.__version__) # 输出: '1.4.4' df = pandas.DataFrame(data={"end_date": [datetime(2022, 1, 20, tzinfo=timezone.utc)]}) print(df.end_date.dt.tz) # 输出: datetime.timezone.utc # 使用字典参数调用fillna,无缺失值但时区丢失 result1 = df.fillna(value={"end_date": datetime.now(tz=timezone.utc)}).end_date.dt.tz print(result1) # 输出: None # 直接对Series调用fillna,时区保留 result2 = df.assign(end_date=lambda df: df["end_date"].fillna(datetime.now(tz=timezone.utc))).end_date.dt.tz print(result2) # 输出: datetime.timezone.utc
结论
这是pandas 1.4.x版本的预期行为,属于该版本的设计限制,在pandas 1.5.0及后续版本中已修复此问题。
原因说明
在pandas 1.4.x中,当使用fillna(value={列名: 填充值})的字典参数形式时,即使目标列没有缺失值,内部的类型对齐逻辑仍会被触发。该逻辑在处理带时区的datetime类型时存在缺陷:填充值的时区信息会被忽略,导致原列的时区信息被强制剥离。
而直接对Series调用fillna()时,类型检查逻辑会严格匹配原列的带时区datetime类型,因此即使执行填充操作(哪怕无缺失值),时区信息也会被完整保留。
内容的提问来源于stack exchange,提问作者Flavien Lambert
相关产品推荐
相关产品推荐

