如何避免DataFrame.resample移除小时信息,提取每日价格最小值并保留时段
按天提取小时级数据集的最小值并保留小时信息
问题描述
处理小时级价格数据集时,需要按天提取各价格列的最小值,同时保留datetime中的小时信息(后续需为每个小时添加其他信息再合并)。
原始数据示例:
Price_REG1 Price_REG2 ... Price_24_3 Price_24_4 date ... 2020-01-01 00:00:00 30.83 30.83 ... NaN NaN 2020-01-01 01:00:00 28.78 28.78 ... NaN NaN 2020-01-01 02:00:00 28.45 28.45 ... 30.83 30.83 2020-01-01 03:00:00 27.90 27.90 ... 28.78 28.78 2020-01-01 04:00:00 27.52 27.52 ... 28.45 28.45
使用以下代码提取最小值:
df_min_1 = df_hour_1[['Price_REG1', 'Price_REG2', 'Price_REG3', 'Price_REG4']].between_time('00:00', '23:00').resample('d').min()
得到的结果(丢失小时信息):
Price_REG1 Price_REG2 Price_REG3 Price_REG4 date 2020-01-01 25.07 25.07 25.07 25.07 2020-01-02 12.07 12.07 12.07 12.07 2020-01-03 0.14 0.14 0.14 0.14 2020-01-04 3.83 3.83 3.83 3.83 2020-01-05 25.77 25.77 25.77 25.77
期望结果(保留指定小时,示例为01:00):
Price_REG1 Price_REG2 Price_REG3 Price_REG4 date 2020-01-01 01:00:00 25.07 25.07 25.07 25.07 2020-01-02 01:00:00 12.07 12.07 12.07 12.07 2020-01-03 01:00:00 0.14 0.14 0.14 0.14 2020-01-04 01:00:00 3.83 3.83 3.83 3.83 2020-01-05 01:00:00 25.77 25.77 25.77 25.77
解决方案
方法1:resample后修改索引
先通过resample计算日最小值,再将索引的时间部分替换为目标小时(比如01:00):
import pandas as pd # 计算日最小值 df_min = df_hour_1[['Price_REG1', 'Price_REG2', 'Price_REG3', 'Price_REG4']].resample('d').min() # 修改索引,添加目标小时 df_min.index = df_min.index + pd.Timedelta(hours=1)
方法2:按日期分组计算,再匹配原时间的小时
先提取日期部分分组计算最小值,然后与原数据中对应小时的时间戳合并:
# 按日期分组计算日最小值 daily_min = df_hour_1.groupby(df_hour_1.index.date)[['Price_REG1', 'Price_REG2', 'Price_REG3', 'Price_REG4']].min() # 获取原数据中每天目标小时的时间戳(这里取每天01:00的记录) target_timestamps = df_hour_1.between_time('01:00', '01:00').index # 将daily_min的索引替换为目标时间戳 daily_min.index = target_timestamps df_min = daily_min
方法3:使用assign创建日期列后分组
先新增日期列,分组计算最小值后,再将日期与目标小时组合成新的datetime索引:
# 新增日期列 df_hour_1['date_only'] = df_hour_1.index.date # 按日期分组计算最小值 daily_min = df_hour_1.groupby('date_only')[['Price_REG1', 'Price_REG2', 'Price_REG3', 'Price_REG4']].min() # 组合日期与目标小时为datetime索引 daily_min.index = pd.to_datetime(daily_min.index.astype(str) + ' 01:00:00') df_min = daily_min
内容的提问来源于stack exchange,提问作者user20050294
相关产品推荐
相关产品推荐

