如何基于多条件替换时间戳类型数据中的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
相关产品推荐
相关产品推荐

