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

如何使用pandas的.interpolate(method='time')填充datetime64[ns]类型列的缺失值?

如何使用pandas的.interpolate(method='time')填充datetime64[ns]类型列的缺失值?

嗨,我来帮你搞定这个问题!首先先纠正你代码里的一个小细节:你写了df['D'].astype('datetime64[ns]')但没把结果赋值回原列,这步操作其实不会改变DataFrame里的'D'列,得改成df['D'] = df['D'].astype('datetime64[ns]')才算生效哦。

接下来,咱们说说interpolate(method='time')的核心要求:这个方法是基于datetime类型的索引来做时间间隔插值的,所以直接对普通整数索引下的'D'列用它会报错。结合你的需求(填充'D'列的NaT缺失值),咱们可以这样操作:

完整实现步骤&代码

  1. 先创建并预处理你的DataFrame(修正类型转换的赋值问题)
  2. 提取'D'列的完整时间范围,把'D'列设为索引后重新对齐到完整日期
  3. 用interpolate(method='time')处理(此时索引是datetime,符合方法要求)
  4. 把索引转回成'D'列,恢复原数据结构
import pandas as pd

# 1. 创建你给出的DataFrame并预处理
df = pd.DataFrame(
    {
        'A': range(6),
        'D': pd.date_range('20240101', periods=6, freq='D')
    }
)
# 确保D列为datetime类型并赋值
df['D'] = df['D'].astype('datetime64[ns]')
# 设置缺失值
df.loc[2, 'D'] = pd.NaT

# 2. 提取完整的时间范围,把D列设为索引后重新对齐
full_date_range = pd.date_range(start=df['D'].min(), end=df['D'].max(), freq='D')
# 先删除缺失值行,再设置D列为索引,最后重新索引到完整日期
temp_df = df.dropna().set_index('D').reindex(full_date_range)

# 3. 使用time插值方法填充(此时索引是datetime,满足方法要求)
temp_df = temp_df.interpolate(method='time')

# 4. 恢复原数据结构:把索引转回D列,重置整数索引
filled_df = temp_df.reset_index().rename(columns={'index': 'D'})

# 查看结果
print(filled_df)

运行结果

你会得到填充后的DataFrame,其中'D'列的NaT被成功替换为2024-01-03(正好是前后日期的中间值),同时'A'列的缺失值也会被基于时间间隔的线性插值填充为2.0(和原行的A值一致,因为时间间隔均匀):

D    A
0 2024-01-01  0.0
1 2024-01-02  1.0
2 2024-01-03  2.0
3 2024-01-04  3.0
4 2024-01-05  4.0
5 2024-01-06  5.0

补充说明

如果你的需求只是单纯填充'D'列的NaT,而不需要处理'A'列,其实也可以用这个流程——因为重新索引后,'D'列就变成了完整的日期索引,转回列后自然就没有缺失值了,interpolate(method='time')主要是用来处理数值列的时间插值,不过刚好能配合这个流程完成你的需求。

备注:内容来源于stack exchange,提问作者Mohamad Osama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:13:01