咨询:Pandas合并两个DataFrame的更优实现方法
更优的DataFrame时间段筛选合并方案
嘿,针对你现在的需求,我整理了几个比原方案更简洁高效的实现方式,核心是减少不必要的中间步骤和对象创建,一起来看看吧:
方案1:布尔索引一步筛选(最简洁)
直接利用dt.hour提取小时,通过布尔条件一次性筛选出所有符合时间段的行,无需拆分再合并:
import pandas as pd import numpy as np N = 50 df = pd.DataFrame({'date': pd.date_range('2000-1-1', periods=N, freq='H'), 'value': np.random.random(N)}) # 筛选7-8点、12-13点的记录(注意between是左闭右闭,所以9点前是到8点,14点前是到13点) comb_data = df[(df['date'].dt.hour.between(7, 8)) | (df['date'].dt.hour.between(12, 13))].reset_index(drop=True)
优势:代码紧凑,没有中间变量,仅需一次筛选操作,性能最优,可读性也很强。
方案2:合并索引器后一次性提取
如果还是想使用indexer_between_time,可以先合并两个时间段的索引器,再一次性提取行,避免concat操作:
import pandas as pd import numpy as np N = 50 df = pd.DataFrame({'date': pd.date_range('2000-1-1', periods=N, freq='H'), 'value': np.random.random(N)}) index = pd.DatetimeIndex(df['date']) # 合并两个时间段的索引位置 combined_indexer = np.union1d( index.indexer_between_time('7:00', '9:00'), index.indexer_between_time('12:00', '14:00') ) comb_data = df.iloc[combined_indexer].reset_index(drop=True)
优势:保留了你原本使用indexer_between_time的习惯,同时减少了一次DataFrame合并操作,大数据量下效率提升明显。
方案3:基于小时集合的灵活筛选
如果需要频繁调整目标时间段,这种方式的可读性和灵活性最高:
import pandas as pd import numpy as np N = 50 df = pd.DataFrame({'date': pd.date_range('2000-1-1', periods=N, freq='H'), 'value': np.random.random(N)}) # 定义需要筛选的小时集合,修改起来非常方便 target_hours = set(range(7, 9)) | set(range(12, 14)) comb_data = df[df['date'].dt.hour.isin(target_hours)].reset_index(drop=True)
优势:调整时间段只需修改target_hours集合,无需改动筛选逻辑,适合需求多变的场景。
整体来说,这三个方案都比原方案更优,核心是避免先拆分再合并的冗余操作,直接一次性获取目标数据,无论是代码简洁度还是运行效率都有提升。
内容的提问来源于stack exchange,提问作者Min
相关产品推荐
相关产品推荐

