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

如何基于多条件替换时间戳类型数据中的NaN值?

按条件填充DataFrame中的NaN时间值

问题背景

现有如下DataFrame:

import pandas as pd
from datetime import datetime

df = pd.DataFrame({'Start':['2022-12-07 06:24:48','2022-12-08 14:37:16','2022-12-09 08:00:59','2022-12-12 09:31:23','2022-12-12 11:11:17'],
'End':['2022-12-07 10:07:00','2022-12-08 17:51:21', 'NaN', 'NaN', 'NaN']})

df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])

需要按以下规则填充End列的NaN值:

  • 若Start的日期为当日(示例中为2022-12-12),则替换为datetime.now()生成的当前时间戳
  • 若Start的日期非当日,则替换为对应Start日期的23:59:59

尝试用fillna结合datetime.combine时,因df['Start'].dt.date是Series而非单个参数报错;已用mask筛选行,但不想通过循环实现。

解决方案

可以利用pandas的向量操作实现,无需循环,提供两种写法:

方法一:利用np.where构造填充值

import numpy as np

today = datetime.today().date()

# 构造对应每一行的填充值
fill_values = np.where(
    df['Start'].dt.date == today,
    datetime.now(),
    pd.to_datetime(df['Start'].dt.date) + pd.Timedelta(days=1, seconds=-1)
)

# 填充NaN
df['End'] = df['End'].fillna(pd.Series(fill_values, index=df.index))

方法二:利用loc按mask批量赋值

today = datetime.today().date()

# 处理非当日的NaN行:将日期设为Start的日期,时间为23:59:59
mask_ntd = (df['Start'].dt.date != today) & df['End'].isna()
df.loc[mask_ntd, 'End'] = pd.to_datetime(df.loc[mask_ntd, 'Start'].dt.date) + pd.Timedelta(days=1, seconds=-1)

# 处理当日的NaN行:替换为当前时间
mask_td = (df['Start'].dt.date == today) & df['End'].isna()
df.loc[mask_td, 'End'] = datetime.now()

两种方法都通过向量运算批量处理数据,避免了循环,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:45:11