如何合并不同时间间隔的两个dataframe实现同步绘图
不同采样间隔的环境音量/步数数据对齐与同图对比方案
时间轴不对齐问题处理
两类数据采集时段一致但采样间隔不同时,不要直接硬拼时间点,用pandas统一重采样到相同时间粒度即可,操作步骤如下:
- 先把两份数据的时间字段统一转换为标准时间格式,设为索引
import pandas as pd import matplotlib.pyplot as plt # 替换为你自己的数据集变量名、时间列名、数值列名 df_volume['timestamp'] = pd.to_datetime(df_volume['timestamp']) df_step['timestamp'] = pd.to_datetime(df_step['timestamp']) df_volume = df_volume.set_index('timestamp') df_step = df_step.set_index('timestamp')
- 选定统一的重采样粒度,建议选两个采样间隔中数值更大的粗粒度,减少无意义的插值:比如音量是10秒采一次、步数是1分钟采一次,就统一对齐到1分钟粒度。密采样的音量数据取时间窗口内的均值,疏采样的步数数据用线性插值/前向填充补全对应时间点的数值:
# 按需调整时间粒度,30s=30秒,1min=1分钟,5min=5分钟 sample_freq = '1min' # 音量数据按窗口取均值 df_volume_align = df_volume.resample(sample_freq).mean() # 步数数据插值补全,不需要插值可以换为ffill()前向填充 df_step_align = df_step.resample(sample_freq).interpolate(method='linear') # 按时间索引合并,剔除空值得到完全对齐的数据集 df_aligned = pd.concat([df_volume_align, df_step_align], axis=1).dropna()
曲线幅度差异过大问题处理
步数曲线被压得几乎看不见的核心原因是两类数据量纲、数值范围完全不匹配:环境音量通常在30~120dB区间,单时间窗口的步数往往只有个位数到几十,共用同一个Y轴时步数的波动会被完全压缩。
不要用同Y轴硬画,也不需要强行归一化破坏原始数值含义,直接用双Y轴绘图即可,两个Y轴分别适配两类数据的数值范围:
fig, ax1 = plt.subplots(figsize=(12, 6), dpi=100) # 左Y轴绑定音量数据 color_vol = '#2563eb' ax1.set_xlabel('采集时间') ax1.set_ylabel('环境音量 (dB)', color=color_vol) line_vol, = ax1.plot(df_aligned.index, df_aligned['volume'], color=color_vol, alpha=0.7, label='环境音量') ax1.tick_params(axis='y', labelcolor=color_vol) # 右Y轴绑定步数数据 ax2 = ax1.twinx() color_step = '#ea580c' ax2.set_ylabel('时间窗口内步数', color=color_step) line_step, = ax2.plot(df_aligned.index, df_aligned['step'], color=color_step, alpha=0.7, label='人体步数') ax2.tick_params(axis='y', labelcolor=color_step) # 合并图例 plt.legend(handles=[line_vol, line_step], loc='upper right') plt.title('同步时间轴下环境音量与人体步数变化趋势对比') plt.tight_layout() plt.show()
补充:如果后续要做相关性分析,建议先对对齐后的两个序列做平稳性检验,必要时做z-score标准化后再计算相关系数,避免量纲差异干扰结果。
内容的提问来源于stack exchange,提问作者Niels Witlox
相关产品推荐
相关产品推荐

