Python pandas按指定行数新增时间行且保留原有时间间隙
问题原因
你当前使用的全局重采样+前向填充逻辑存在本质缺陷:
- 全局按分钟重采样会生成两个相邻活动之间所有分钟的空行,前向填充会把上一个活动的类型错误填充到这些空隙行里
- 全局重采样的时间范围默认只覆盖原始数据的最早到最晚时间点,因此最后一条活动需要补充的后续分钟行不会被生成
正确实现方案
放弃全局重采样思路,改为遍历每条原始活动记录,独立为每条记录生成对应时长的逐分钟时间行,再合并所有行即可,既不会填充活动间空隙,也能完整补全最后一条活动的后续行。
可直接运行的代码
import pandas as pd # 复现示例数据 Dffit = pd.DataFrame({ "Time": ['2022-05-28 08:52:00','2022-05-28 09:00:00','2022-05-28 09:09:00'], "fitnessActivity": ['running','biking','swimming'], "minutes": [3,5,4] }) # 时间列转datetime类型,修正原代码format参数多余毫秒占位符的问题 Dffit['Time'] = pd.to_datetime(Dffit['Time'], format='%Y-%m-%d %H:%M:%S') expanded_df_list = [] for _, record in Dffit.iterrows(): # 为当前活动生成从起始时间开始、共minutes条的1分钟间隔时间序列 minute_timestamps = pd.date_range( start=record['Time'], periods=record['minutes'], freq='1min' ) # 构造当前活动的所有行:仅起始行保留minutes值,其余行minutes为空 single_activity_rows = pd.DataFrame({ 'Time': minute_timestamps, 'fitnessActivity': record['fitnessActivity'], 'minutes': [record['minutes']] + [float('nan')] * (record['minutes'] - 1) }) expanded_df_list.append(single_activity_rows) # 合并所有行,按时间排序后重置索引 final_result = pd.concat(expanded_df_list, ignore_index=True) final_result = final_result.sort_values('Time').reset_index(drop=True) print(final_result)
运行输出(和期望格式完全一致)
Time fitnessActivity minutes 0 2022-05-28 08:52:00 running 3.0 1 2022-05-28 08:53:00 running NaN 2 2022-05-28 08:54:00 running NaN 3 2022-05-28 09:00:00 biking 5.0 4 2022-05-28 09:01:00 biking NaN 5 2022-05-28 09:02:00 biking NaN 6 2022-05-28 09:03:00 biking NaN 7 2022-05-28 09:04:00 biking NaN 8 2022-05-28 09:09:00 swimming 4.0 9 2022-05-28 09:10:00 swimming NaN 10 2022-05-28 09:11:00 swimming NaN 11 2022-05-28 09:12:00 swimming NaN
额外说明
- 如果你的原始数据存在时间乱序的情况,代码里的
sort_values('Time')会自动把所有行按时间先后排好,不需要提前对原始数据排序 - 该逻辑对任意时长的活动记录都生效,不会出现活动间空隙被错误填充的问题
内容的提问来源于stack exchange,提问作者Brooke
相关产品推荐
相关产品推荐

