如何按Datetime遍历Pandas DataFrame并向前填充-1值?
解决Pandas按code向前填充非-1值的问题
问题分析
你当前代码的核心错误是分组逻辑错误:你按calendardate分组,每个分组仅包含当前时间点的记录,无法获取同一code下更早的非-1值进行填充。正确的分组维度应该是code,因为填充逻辑依赖于同一code的时间序列历史数据。
正确实现步骤
- 按
code分组,确保每个组内的记录按calendardate升序排列(保证历史数据在前) - 将A/B/C列中的-1替换为
pd.NA,使用ffill()向前填充最近的非缺失值 - 填充完成后,遍历每个唯一的
calendardate,获取对应时间点的所有记录
完整代码
import pandas as pd # Sample DataFrame data = { 'code': ['A1', 'A1', 'A1', 'A1', 'A1', 'A1', 'B1', 'B1', 'B1', 'B1'], 'calendardate': [ '2024-02-29 09:00:00', '2024-02-29 09:05:00', '2024-02-29 09:10:00', '2024-02-29 09:15:00', '2024-02-29 09:20:00', '2024-02-29 09:25:00', '2024-02-29 09:00:00', '2024-02-29 09:05:00', '2024-02-29 09:10:00', '2024-02-29 09:15:00' ], 'A': [10, -1, 20, -1, 30, 40, 50, -1, -1, 60], 'B': [-1, 15, -1, 25, -1, 35, -1, 45, -1, -1], 'C': [-1, -1, -1, 35, -1, -1, -1, -1, 55, 65] } df = pd.DataFrame(data) df['calendardate'] = pd.to_datetime(df['calendardate']) # 按code分组,对每个组内的时间序列进行向前填充 def forward_fill_by_code(group): # 按时间升序排序,确保历史数据顺序正确 group_sorted = group.sort_values(by='calendardate') # 对A/B/C列依次替换-1并向前填充 for col in ['A', 'B', 'C']: group_sorted[col] = group_sorted[col].replace(-1, pd.NA).ffill() return group_sorted # 应用分组填充逻辑,group_keys=False避免额外索引 filled_df = df.groupby('code', group_keys=False).apply(forward_fill_by_code) # 遍历每个唯一时间点,输出对应切片数据 for dt in filled_df['calendardate'].unique(): print(f"=== Datetime: {dt} ===") time_slice = filled_df[filled_df['calendardate'] == dt] for _, row in time_slice.iterrows(): print(f"Code: {row['code']}, A: {row['A']}, B: {row['B']}, C: {row['C']}") print("------------------------")
关键说明
groupby('code'):将同一code的所有时间记录归为一组,确保ffill()能访问到该code的历史非-1值sort_values(by='calendardate'):保证时间序列顺序正确,避免填充时取到未来数据- 填充完成后,直接按
calendardate筛选即可得到每个时间点的最终数据,比如A1在2024-02-29 09:05:00的A值会被填充为10,符合预期
内容的提问来源于stack exchange,提问作者Edy Bourne
相关产品推荐
相关产品推荐

