基于ID1、ID2分组对Pandas DateIndex行向上采样含历史日期
按分组向上采样并生成每个日期子DataFrame的解决方案
嘿,我来帮你搞定这个需求!首先咱们先把你给的原始数据转换成pandas能处理的DataFrame,然后一步步实现分组向上采样,最后拆分出每个日期的子DataFrame。
第一步:准备原始数据
先把你的数据转成pandas DataFrame,同时把Date列转换成datetime类型(这是时间序列处理的关键):
import pandas as pd # 你的原始数据 raw_data = [ [1, 1, '2018-01-05', 75], [1, 1, '2018-01-06', 83], [1, 1, '2018-01-07', 17], [1, 1, '2018-01-08', 15], [1, 2, '2018-02-01', 85], [1, 2, '2018-02-02', 98], [2, 1, '2018-02-15', 54], [2, 1, '2018-02-16', 17], [2, 1, '2018-02-17', 83], [2, 1, '2018-02-18', 94], [2, 2, '2017-12-18', 16], [2, 2, '2017-12-19', 84], [2, 2, '2017-12-20', 47], [2, 2, '2017-12-21', 28], [2, 2, '2017-12-22', 38] ] # 转换成DataFrame df = pd.DataFrame(raw_data, columns=['ID1', 'ID2', 'Date', 'Values']) # 把Date列转为datetime类型 df['Date'] = pd.to_datetime(df['Date'])
第二步:按['ID1','ID2']分组向上采样
接下来咱们要在每个分组内补全连续的日期(也就是向上采样)。这里我用按天重采样的方式,同时用前向填充来补全缺失的Values(你也可以根据需求换成后向填充bfill,或者留空用asfreq()):
# 定义分组处理函数 def upsample_single_group(group): # 设置Date为索引,按天重采样,填充缺失值 resampled_group = group.set_index('Date').resample('D').ffill().reset_index() # 把ID1和ID2重新赋值(因为重采样后会丢失分组标识) resampled_group['ID1'] = group['ID1'].iloc[0] resampled_group['ID2'] = group['ID2'].iloc[0] return resampled_group # 对每个分组应用处理函数 upsampled_full_df = df.groupby(['ID1', 'ID2']).apply(upsample_single_group).reset_index(drop=True)
第三步:拆分出每个日期的子DataFrame
现在我们已经有了补全所有连续日期的完整DataFrame,接下来可以把每个日期对应的数据拆成单独的子DataFrame,用字典存储方便后续调用:
# 按Date分组,生成子DataFrame字典 date_sub_dataframes = {date: group for date, group in upsampled_full_df.groupby('Date')} # 举个例子,查看2018-01-06的子DataFrame print(date_sub_dataframes[pd.to_datetime('2018-01-06')])
这段代码运行后,你就能得到每个日期对应的子DataFrame,比如上面的示例输出会是:
Date Values ID1 ID2 0 2018-01-06 83 1 1
额外小技巧
如果你想把每个子DataFrame保存成单独的CSV文件,可以加个循环:
for date, sub_df in date_sub_dataframes.items(): # 把日期转成字符串作为文件名 filename = f"daily_data_{date.strftime('%Y-%m-%d')}.csv" sub_df.to_csv(filename, index=False)
内容的提问来源于stack exchange,提问作者Ignaski
相关产品推荐
相关产品推荐

