如何利用pandas DataFrame其他列信息替换NaT为指定日期
解决pandas中用年份填充NaT日期列的问题
错误原因
你用dt.date(df2["start_year"], 12, 31)报错是因为Python标准库的dt.date()只能接收单个整数作为年/月/日参数,但你传入的df2["start_year"]是pandas Series(整数值序列),无法直接转换,因此抛出TypeError。
正确解决方案
使用pandas自带的pd.to_datetime()函数,它支持向量化操作,可批量处理整列的年份转换:
方法1:直接填充所有NaT值(推荐,简洁高效)
import pandas as pd # 构造示例DataFrame df2 = pd.DataFrame({ 'start': [pd.NaT, pd.NaT], 'end': [pd.NaT, pd.NaT], 'start_year': [2020, 2021] }) # 填充start列为当年1月1日 df2['start'] = df2['start'].fillna(pd.to_datetime(df2['start_year'], format='%Y')) # 填充end列为当年12月31日 df2['end'] = df2['end'].fillna(pd.to_datetime(dict(year=df2['start_year'], month=12, day=31)))
方法2:仅填充指定条件的行(与你原代码逻辑匹配)
如果你只想填充start、end均为NaT且start_year非空的行,可通过掩码定位目标行:
import pandas as pd # 构造掩码筛选目标行 mask = df2['start'].isna() & df2['end'].isna() & df2['start_year'].notna() # 批量填充start列 df2.loc[mask, 'start'] = pd.to_datetime(df2.loc[mask, 'start_year'], format='%Y') # 批量填充end列 df2.loc[mask, 'end'] = pd.to_datetime({ 'year': df2.loc[mask, 'start_year'], 'month': 12, 'day': 31 })
运行后即可得到预期结果:
| start | end | start_year |
|---|---|---|
| 2020-01-01 | 2020-12-31 | 2020 |
| 2021-01-01 | 2021-12-31 | 2021 |
补充说明
pd.to_datetime(df2['start_year'], format='%Y')会自动将年份整数转换为对应年份的1月1日,无需手动指定月日。- 以字典形式传入
year/month/day参数时,pandas会自动匹配每一行的对应值生成日期,完美适配批量操作场景。
内容的提问来源于stack exchange,提问作者ESL
相关产品推荐
相关产品推荐

