You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:10:43