Python中如何反向重采样DataFrame并保留最后一行数据
反向时间重采样(从最后一行开始)解决方案
要实现从DataFrame最后一行时间点开始的反向重采样,同时保留最后一行数据,可通过自定义分组键的方式实现,支持任意大于1分钟的时间间隔,具体步骤如下:
核心思路
默认resample是从最早时间点正向划分窗口,我们需要以最后一行的时间为基准,反向计算每个数据点所属的时间窗口,再按窗口分组聚合。
代码实现
假设你的DataFrame索引是带时区的Datetime类型,以下是通用实现代码:
import pandas as pd from pandas.tseries.frequencies import to_offset # 1. 定义重采样间隔(支持字符串如"75min"、"2h",或数值分钟数) resample_interval = "75min" # 2. 将间隔转换为分钟数,方便计算 if isinstance(resample_interval, str): interval_min = to_offset(resample_interval).nanos // (60 * 1e9) else: interval_min = resample_interval # 直接传入分钟数时使用 # 3. 获取DataFrame最后一行的时间戳 last_time = df.index[-1] # 4. 为每个数据点计算所属的反向窗口分组ID # 逻辑:每个点到last_time的分钟差 ÷ 间隔分钟数,取整后得到分组ID # 分组ID=0对应最后一个窗口(包含last_time),ID=1对应往前推一个间隔的窗口,以此类推 df["reverse_group"] = ((last_time - df.index).total_seconds() // (60 * interval_min)).astype(int) # 5. 按分组ID聚合,指定聚合规则 reverse_resampled = df.groupby("reverse_group").agg( {"Close": "last", "Volume": "sum"} ) # 6. 将分组ID转换为窗口的结束时间(即每个窗口的最后一个时间点,作为新索引) reverse_resampled.index = last_time - pd.to_timedelta(reverse_resampled.index * interval_min, unit="m") # 7. 按时间索引排序(可选,让结果从早到晚排列) reverse_resampled = reverse_resampled.sort_index() # 查看结果 print(reverse_resampled)
结果说明
以你提供的75分钟间隔为例,最终结果的索引会是:
- 最后一行索引为
2022-09-01 15:59:00-04:00(原DataFrame最后一行时间) - 上一行索引为
2022-09-01 14:44:00-04:00(15:59往前推75分钟) - 以此类推,每个窗口的时间范围是
[索引时间-间隔, 索引时间],完全符合你反向重采样的需求。
注意事项
- 确保DataFrame的索引是DatetimeIndex类型,且带时区(如果你的数据有时区),避免时间计算错误。
- 支持任意大于1分钟的间隔:无论是字符串格式(如"30min"、"1h30min")还是直接传入分钟数值(如75、120),代码都能处理。
内容的提问来源于stack exchange,提问作者Ivo
相关产品推荐
相关产品推荐

