如何用Pandas提取前一天9:30至当日9:00时段的每日Value最大值
解决方案
步骤1:处理夏令时重复记录
先对同一时间点的重复记录取最大值,确保每个时间戳唯一:
# 按时间分组取最大值,消除夏令时导致的重复记录 df = df.groupby('Local_Time_Dt')['Value'].max().reset_index()
步骤2:筛选目标时段的记录
只保留属于「前一天09:30到当日09:00」范围内的时间点,排除09:00-09:30的无效时段:
# 定义时间阈值 t_930 = pd.to_datetime('09:30').time() t_900 = pd.to_datetime('09:00').time() # 筛选符合条件的记录:时间>=09:30 或 <=09:00 df = df[(df['Local_Time_Dt'].dt.time >= t_930) | (df['Local_Time_Dt'].dt.time <= t_900)]
步骤3:为每个记录分配目标统计日期
根据时间点所属的周期,标记对应的目标日期(比如1999-02-21 09:30的记录属于1999-02-22的统计周期):
import numpy as np # 提取日期和时间部分 dates = df['Local_Time_Dt'].dt.date times = df['Local_Time_Dt'].dt.time # 生成目标日期:时间>=09:30的归为次日,否则归为当日 df['Target_Date'] = np.where(times >= t_930, dates + pd.Timedelta(days=1), dates)
步骤4:分组求每日最大值并补全缺失日期
按目标日期分组取最大值,同时生成完整日期序列补全缺失的日期(缺失值填充为0):
# 按目标日期分组求最大值 daily_max = df.groupby('Target_Date')['Value'].max().reset_index() # 生成完整的日期范围 full_dates = pd.date_range(start=daily_max['Target_Date'].min(), end=daily_max['Target_Date'].max(), freq='D') full_dates_df = pd.DataFrame({'Target_Date': full_dates}) # 合并补全缺失日期,填充缺失值为0 result = pd.merge(full_dates_df, daily_max, on='Target_Date', how='left').fillna(0) # 重命名列符合输出要求 result.rename(columns={'Target_Date': 'Local_Time_Dt'}, inplace=True)
最终的result即为所需格式,每个日期对应其统计时段内的最大值,缺失日期也会被补全并填充为0。
内容的提问来源于stack exchange,提问作者Grassland Curing
相关产品推荐
相关产品推荐

