如何在Pandas中匹配两个DataFrame时间戳范围并裁剪不匹配部分
解决Pandas不同频率DataFrame时间范围对齐问题
当两个DataFrame时间戳频率不同,且时间范围有重叠但不完全一致时,核心思路是先确定两者的共同时间区间,再分别裁剪到该区间,具体实现步骤如下:
步骤说明
- 确保两个DataFrame的索引为
datetime类型(若原索引是字符串格式,需先转换) - 计算共同时间范围:取两个DataFrame起始时间的最大值(最晚开始点)、结束时间的最小值(最早结束点)
- 分别对两个DataFrame按该时间范围切片,得到时间范围完全一致的裁剪后数据
- 按需合并裁剪后的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
相关产品推荐
相关产品推荐

