合并具有不同时间粒度DateTime Index的两个DataFrame:将日度数据填充至30分钟粒度DataFrame并保持其结构
解决不同时间粒度DataFrame的填充问题
没问题,这是时间序列数据处理里很常见的对齐需求,我来给你一步步演示怎么实现:
步骤1:先构造示例数据(方便你复现测试)
首先我们把你描述的两个DataFrame用Pandas创建出来,确保和你的场景完全匹配:
import pandas as pd # 30分钟粒度的第一个DataFrame df1 = pd.DataFrame( data={'col1': ['a', 'b', 'c', 'd', 'e'], 'col2': [1, 2, 3, 4, 5]}, index=pd.to_datetime([ '2019-08-26 13:00:00', '2019-08-26 13:30:00', '2019-08-26 14:00:00', '2019-08-26 14:30:00', '2019-08-26 15:00:00' ]) ) # 日粒度的第二个DataFrame df2 = pd.DataFrame( data={'col3': ['X', 'Y', 'Z']}, index=pd.to_datetime(['2019-08-25', '2019-08-26', '2019-08-27']) )
步骤2:核心对齐填充逻辑
关键思路是把第一个DataFrame的时间索引“归一化”到日期级,让它能和第二个DataFrame的日索引完美匹配,然后批量填充对应值。一行代码就能搞定:
# 将df2的日粒度值填充到df1对应的所有当日行中 df1['col3'] = df1.index.normalize().map(df2['col3'])
代码细节解释:
df1.index.normalize():把30分钟粒度的时间索引转换为当日的午夜时间(比如2019-08-26 13:00:00会变成2019-08-26 00:00:00),这样就和df2的日粒度索引格式完全一致了。.map(df2['col3']):根据归一化后的日期,自动从df2中取出对应日期的col3值,填充到df1的每一行里。
最终结果
运行完上面的代码后,你打印df1就会得到你想要的结构:
col1 col2 col3 2019-08-26 13:00:00 a 1 Y 2019-08-26 13:30:00 b 2 Y 2019-08-26 14:00:00 c 3 Y 2019-08-26 14:30:00 d 4 Y 2019-08-26 15:00:00 e 5 Y
额外补充:处理缺失日期的情况
如果df1中存在df2没有对应日期的行,map会返回NaN。如果你想给这些缺失值设置默认值,可以这样处理:
df1['col3'] = df1.index.normalize().map(df2['col3']).fillna('默认值')
内容的提问来源于stack exchange,提问作者Vasilis Iak
相关产品推荐
相关产品推荐

