如何根据多个pandas DataFrame的最大起始日期按datetime裁剪数据集
问题分析
你的代码存在4个核心错误:
- 切片逻辑完全反向:
iloc[len(finalDateRange):, :]是丢弃前len(finalDateRange)行、只保留末尾部分行,和你要保留目标日期之后所有行的需求完全相反,这是输出结果只剩最后几十天数据的核心原因。 - 日期处理逻辑错误:你提取的
dic1[i]['Date'][0]是datetime.date类型,直接拼接字符串startDate + ' 00:00'会触发类型错误,且你没有对最大起始日期做+1天处理,不符合「取最大起始日期次日」的要求。 - 裁剪逻辑不可靠:用固定长度切片没有考虑不同df的起始小时差异,很容易出现对齐错误,直接按日期字段过滤更准确。
- 未重置索引:你期望输出的行号从0开始,原代码裁剪后保留了原df的旧索引,所以行号会从8000+开始。
正确实现代码
完整可运行的修改后代码如下:
import pandas as pd import numpy as np dateRange1 = pd.date_range('01/01/2020 04:00', '12/31/2020 23:00', freq='1H') dateRange2 = pd.date_range('01/09/2020 08:00', '12/31/2020 23:00', freq='1H') dateRange3 = pd.date_range('01/15/2020 11:00', '12/31/2020 23:00', freq='1H') dic1 = { 'df1': { 'Date': dateRange1.date, 'HE': dateRange1.hour, 'Data': np.random.randint(1,100,len(dateRange1)) }, 'df2': { 'Date': dateRange2.date, 'HE': dateRange2.hour, 'Data': np.random.randint(1,100,len(dateRange2)) }, 'df3': { 'Date': dateRange3.date, 'HE': dateRange3.hour, 'Data': np.random.randint(1,100,len(dateRange3)) } } dfList = {} for i in dic1.keys(): dfList[i] = pd.DataFrame(dic1[i]) # 计算所有df的最大起始日期,再+1天得到裁剪起点 max_start_date = max(df['Date'].min() for df in dfList.values()) cutoff_date = max_start_date + pd.Timedelta(days=1) newDFList = {} for name, df in dfList.items(): # 按日期过滤后重置索引 new_df = df[df['Date'] >= cutoff_date].reset_index(drop=True) newDFList[name] = new_df print(f"===== {name} =====") print(new_df)
运行后所有输出的DataFrame都会从2020-01-16开始,索引从0计数,长度完全一致,符合你的预期。
内容的提问来源于stack exchange,提问作者Vesper
相关产品推荐
相关产品推荐

