如何用Pandas聚合30秒DataFrame为3分钟均值并做相关性分析
解决不同时间间隔DataFrame的相关性分析问题
1. 统一时间格式并生成3分钟窗口键
首先需要将两个DataFrame的时间数据转换为标准datetime格式,并生成3分钟窗口基准时间,为后续数据对齐做准备。
处理3分钟间隔的DataFrame
import pandas as pd # 替换为你的实际数据读取代码,比如pd.read_csv('your_file.csv') df_3min = pd.DataFrame({ 'Day': ['18.08.2019', '18.08.2019', '18.08.2019'], 'Time': ['11:42:05', '11:45:06', '11:48:06'], 'Senderrate': [1087, 1141, 1049], 'S-Unit': ['Mbits/sec']*3, 'Retransmissions': [0,0,0], 'Receiverrate': [1087,1141,1049], 'R-Unit': ['Mbits/sec']*3 }) # 合并Day和Time为datetime列(适配dd.mm.yyyy格式) df_3min['datetime'] = pd.to_datetime(df_3min['Day'] + ' ' + df_3min['Time'], format='%d.%m.%Y %H:%M:%S') # 生成3分钟窗口基准(向下取整到最近的3分钟起点) df_3min['3min_window'] = df_3min['datetime'].dt.floor('3min') # 保留核心分析列 df_3min_clean = df_3min[['3min_window', 'Senderrate', 'Receiverrate', 'Retransmissions']]
处理30秒间隔的DataFrame
# 替换为你的实际数据读取代码 df_30s = pd.DataFrame({ 'Time': ['2019-06-12 00:00:20', '2019-06-12 00:01:20', '2019-06-12 00:01:50'], 'Alarm Sichtweite': [0,0,0], 'Error Code': [0,0,0], 'Sichtweite (m) 1min average': [20000,20000,20000], 'Rain (mm) cumulated': [0.29,0.29,0.29], 'Snow (mm) cummulated': [0,0,0], 'Temp (C°)': [23.6,23.6,23.6], 'Luminance (cd/m²)': [4,4,4] }) # 转换为datetime格式 df_30s['datetime'] = pd.to_datetime(df_30s['Time']) # 按3分钟窗口分组,计算数值列均值 df_30s_agg = df_30s.groupby(df_30s['datetime'].dt.floor('3min')).agg({ 'Sichtweite (m) 1min average': 'mean', 'Rain (mm) cumulated': 'mean', 'Snow (mm) cummulated': 'mean', 'Temp (C°)': 'mean', 'Luminance (cd/m²)': 'mean' }).reset_index().rename(columns={'datetime': '3min_window'})
2. 筛选有效窗口(可选)
如果需要只保留数据条数达标的3分钟窗口(比如至少3条30秒数据),可以在聚合时添加计数筛选:
# 聚合时同时计算均值和数据条数 df_30s_agg = df_30s.groupby(df_30s['datetime'].dt.floor('3min')).agg({ 'Sichtweite (m) 1min average': ['mean', 'count'], 'Rain (mm) cumulated': 'mean', 'Snow (mm) cummulated': 'mean', 'Temp (C°)': 'mean', 'Luminance (cd/m²)': 'mean' }).reset_index() # 重命名列名方便筛选 df_30s_agg.columns = ['3min_window', 'Sichtweite_mean', 'Sichtweite_count', 'Rain_mean', 'Snow_mean', 'Temp_mean', 'Luminance_mean'] # 筛选数据条数≥3的窗口 df_30s_agg_filtered = df_30s_agg[df_30s_agg['Sichtweite_count'] >= 3].drop('Sichtweite_count', axis=1)
3. 合并DataFrame并处理缺失值
将聚合后的30秒数据与3分钟数据按窗口对齐:
# 左连接保留所有3分钟数据,缺失的30秒聚合值用NaN表示 merged_df = pd.merge(df_3min_clean, df_30s_agg, on='3min_window', how='left') # 处理缺失值:按需选择策略 merged_df = merged_df.dropna() # 删除含NaN的行 # 或用前后值填充:merged_df = merged_df.fillna(method='ffill').fillna(method='bfill')
4. 执行相关性分析
用Pandas内置方法计算数值列的相关系数:
# 生成所有数值列的相关系数矩阵 corr_matrix = merged_df.corr(numeric_only=True) print(corr_matrix) # 查看特定列的相关性,比如Senderrate与温度 sender_temp_corr = merged_df['Senderrate'].corr(merged_df['Temp (C°)']) print(f"Senderrate与温度的相关系数: {round(sender_temp_corr, 4)}")
关键注意事项
- 时间对齐逻辑:如果3分钟数据的时间点是窗口结束点,可将
dt.floor('3min')替换为dt.ceil('3min'),确保窗口匹配准确。 - 缺失值策略:若某3分钟区间无30秒数据,合并后会出现NaN,可根据分析场景选择删除、填充或标记。
- 统计方法选择:除默认的皮尔逊相关系数,还可指定
method='spearman'或method='kendall'计算非参数相关系数。
内容的提问来源于stack exchange,提问作者V. Wegener
相关产品推荐
相关产品推荐

