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

如何在Pandas中匹配两个DataFrame时间戳范围并裁剪不匹配部分

解决Pandas不同频率DataFrame时间范围对齐问题

当两个DataFrame时间戳频率不同,且时间范围有重叠但不完全一致时,核心思路是先确定两者的共同时间区间,再分别裁剪到该区间,具体实现步骤如下:

步骤说明

  1. 确保两个DataFrame的索引为datetime类型(若原索引是字符串格式,需先转换)
  2. 计算共同时间范围:取两个DataFrame起始时间的最大值(最晚开始点)、结束时间的最小值(最早结束点)
  3. 分别对两个DataFrame按该时间范围切片,得到时间范围完全一致的裁剪后数据
  4. 按需合并裁剪后的DataFrame(保留原频率,缺失值自动填充为NaN)

代码示例

1. 构造测试数据

import pandas as pd
import numpy as np

# df1:小时频率,时间范围2024-01-01 00:00 ~ 2024-01-01 05:00
date_rng1 = pd.date_range(start='2024-01-01 00:00', end='2024-01-01 05:00', freq='H')
df1 = pd.DataFrame({'value1': np.random.randint(0, 100, len(date_rng1))}, index=date_rng1)

# df2:15分钟频率,时间范围2024-01-01 01:30 ~ 2024-01-01 06:00
date_rng2 = pd.date_range(start='2024-01-01 01:30', end='2024-01-01 06:00', freq='15T')
df2 = pd.DataFrame({'value2': np.random.randint(0, 100, len(date_rng2))}, index=date_rng2)

2. 时间范围对齐与裁剪

# 若原索引不是datetime类型,执行以下转换
# df1.index = pd.to_datetime(df1.index)
# df2.index = pd.to_datetime(df2.index)

# 计算共同时间区间
common_start = max(df1.index.min(), df2.index.min())
common_end = min(df1.index.max(), df2.index.max())

# 裁剪两个DataFrame到共同区间
df1_trimmed = df1.loc[common_start:common_end]
df2_trimmed = df2.loc[common_start:common_end]

3. 合并裁剪后的DataFrame

如果需要将两个裁剪后的DataFrame合并为一个(保留各自时间频率):

merged_df = pd.merge(df1_trimmed, df2_trimmed, left_index=True, right_index=True, how='outer')

关键说明

  • 直接使用join/merge无法得到期望结果的原因:未先限定时间范围,会包含两个DataFrame的所有时间戳;先裁剪到共同区间后,再合并只会保留重叠时间段内的数据
  • 若需要填充缺失值(比如按前值填充),可在合并后执行:merged_df.fillna(method='ffill', inplace=True)

内容的提问来源于stack exchange,提问作者chairman's_cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:25:20