You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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
})

运行后即可得到预期结果:

startendstart_year
2020-01-012020-12-312020
2021-01-012021-12-312021

补充说明

  • pd.to_datetime(df2['start_year'], format='%Y')会自动将年份整数转换为对应年份的1月1日,无需手动指定月日。
  • 以字典形式传入year/month/day参数时,pandas会自动匹配每一行的对应值生成日期,完美适配批量操作场景。

内容的提问来源于stack exchange,提问作者ESL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:55:14