小时级DataFrame分析优化:如何高效关联不同时段阈值与数值?
问题描述
现有一份包含多日小时级数据的DataFrame,示例数据如下:
DATE TIME Threshold Value 2022-11-04 02:00:00 10 9 2022-11-04 03:00:00 11 10 2022-11-04 04:00:00 10 11 2022-11-04 06:00:00 12 11 2022-11-04 05:00:00 12 12 2022-11-04 07:00:00 10 11 2022-11-04 08:00:00 11 10 2022-11-04 09:00:00 11 9 2022-11-04 10:00:00 12 9 2022-11-04 11:00:00 10 10 2022-11-04 12:00:00 10 10 ... 2022-11-05 01:00:00 10 9 2022-11-05 02:00:00 11 10 ...
需要基于Threshold、Value与时间维度做分析,比如要筛选当日04:00的Threshold为10的记录,并获取这些记录对应的当日08:00的Value;未来还要分析其他时段组合。当前采用拆分合并DataFrame的方法操作繁琐,求更高效的实现方案。
高效实现方案
方法一:透视表预构建宽表(适合多时段重复查询)
先按日期分组,将小时时间转为列名,生成Threshold和Value的宽表,后续任意时段组合的查询都能直接通过索引和列名快速获取:
import pandas as pd # 确保DATE和TIME为字符串类型(若原始数据不是则转换) df['DATE'] = df['DATE'].astype(str) df['TIME'] = df['TIME'].astype(str) # 生成Threshold和Value的宽表,行是日期,列是小时时间 threshold_pivot = df.pivot(index='DATE', columns='TIME', values='Threshold') value_pivot = df.pivot(index='DATE', columns='TIME', values='Value') # 筛选04:00时Threshold为10的日期 target_dates = threshold_pivot[threshold_pivot['04:00:00'] == 10].index # 获取对应日期08:00的Value result = value_pivot.loc[target_dates, '08:00:00'].dropna() print(result)
一次构建宽表后,后续查任何时段组合都无需重复预处理,效率极高。
方法二:定向关联查询(适合单次特定时段分析)
如果只是偶尔查询特定时段组合,直接通过日期关联两个筛选后的子表即可:
# 筛选04:00且Threshold为10的记录,仅保留日期列 condition_df = df[(df['TIME'] == '04:00:00') & (df['Threshold'] == 10)][['DATE']] # 筛选08:00的Value记录 value_08_df = df[df['TIME'] == '08:00:00'][['DATE', 'Value']] # 关联得到结果 result = pd.merge(condition_df, value_08_df, on='DATE', how='inner') print(result)
代码简洁,针对单次查询的执行效率最优。
方法三:时间偏移关联(适合按小时差分析)
如果未来需要分析“某时段N小时后的数据”这类场景,先合并日期时间为datetime类型,再通过时间偏移做自关联:
# 合并DATE和TIME为完整时间戳 df['datetime'] = pd.to_datetime(df['DATE'] + ' ' + df['TIME']) # 按日期分组并按时间排序(确保时间顺序正确) df = df.sort_values('datetime').groupby('DATE', group_keys=False).apply(lambda x: x) # 生成偏移4小时的时间列(04:00对应08:00,差4小时) df['datetime_shift'] = df['datetime'] + pd.Timedelta(hours=4) # 自关联匹配偏移后的Value result = pd.merge( df[(df['TIME'] == '04:00:00') & (df['Threshold'] == 10)], df[['datetime', 'Value']], left_on='datetime_shift', right_on='datetime', how='inner' )[['DATE', 'datetime_x', 'Threshold', 'datetime_y', 'Value']] print(result)
扩展性强,可适配任意小时差的时段关联需求。
内容的提问来源于stack exchange,提问作者RazzleDazzle
相关产品推荐
相关产品推荐

