在pandas DataFrame中将NaT替换为时间区间上限时间戳
问题修复方案
问题原因
- 原有代码中
upper_timestamp基于end列计算,最后一行的end为NaT,导致对应的upper_timestamp值也为NaT,fillna使用空值填充自然无法生效。
修复代码
支持自定义时间区间,无需硬编码上限:
import pandas as pd import numpy as np # 自定义时间区间,可按需修改,第一个参数为区间开始时间,第二个为区间结束时间 time_window = ('08:00:00', '09:00:00') window_upper_delta = pd.Timedelta(time_window[1]) df = pd.read_csv('df.csv') df['date'] = pd.to_datetime(df['date']) diff_ids = df['id'] != df['id'].shift(1) df = df[diff_ids].copy() df['start'] = df['date'] df['end'] = df['date'].shift(-1) # 基于无空值的date列计算当日区间上限 upper_timestamp = df['date'].dt.normalize() + window_upper_delta df['end'] = df['end'].fillna(upper_timestamp) df['duration'] = df['end'] - df['start'] print(df)
运行说明
- 如需调整时间区间,直接修改
time_window参数即可,比如修改为('09:00:00', '12:00:00')就会自动使用12:00作为当日区间上限 - 代码中使用无空值的
date列计算上限,可以正确生成最后一行的上限时间,填充end列的NaT,最终得到符合预期的时长计算结果。
内容的提问来源于stack exchange,提问作者GKC
相关产品推荐
相关产品推荐

