如何在Pandas中替换时间序列DataFrame的多层索引时间值?
替换MultiIndex中的Time层级索引值
嘿,我看你需要把MultiIndex里的Time层级从6:00-8:00的15分钟区间,替换成0:00-2:00的对应区间,而且每个日期下的数据顺序要完全对应上对吧?这里有几个简单高效的方法,你可以按需选择:
方法1:分组替换Time值
如果你的数据每个日期下的Time数量固定(都是9条),可以先构造好目标时间序列,再按Date分组替换每个组的Time索引:
import pandas as pd # 先模拟你的原始数据(如果已有数据可以跳过这部分) data = { 'a': [20.31,20.76,21.4,21.84,22.17,22.38,22.75,22.93,23.13]*2, 'b': [0,26738,22462,20033,20010,18133,18254,17039,15934]*2, 'c': [-2.95,-2.88,-2.77,-3,-3.28,-2.82,-3.14,-3.22,-3.27]*2 } index = pd.MultiIndex.from_product([ pd.date_range('2018-01-09', '2018-01-10'), pd.date_range('6:00', '8:00', freq='15T').time ], names=['Date', 'Time']) df = pd.DataFrame(data, index=index) # 构造目标Time序列:00:00到02:00的15分钟间隔 target_times = pd.date_range('0:00', '2:00', freq='15T').time # 按Date分组,给每个组替换Time索引 df = df.groupby(level='Date').apply(lambda x: x.set_axis(target_times, level='Time')) # 重置一下层级顺序,保持和原数据一致 df = df.reorder_levels(['Date', 'Time'])
方法2:时间偏移法(更高效)
观察一下,原始Time和目标Time刚好相差6小时,所以我们可以直接把Time转成datetime类型,减去6小时后再提取时间部分,这个方法不需要分组,大数据量下更快:
# 把Time层级转成datetime,减去6小时,再转回time类型 new_time = pd.to_datetime(df.index.get_level_values('Time'), format='%H:%M:%S') - pd.Timedelta(hours=6) new_time = new_time.time # 重新构造MultiIndex替换原索引 new_index = pd.MultiIndex.from_arrays( [df.index.get_level_values('Date'), new_time], names=['Date', 'Time'] ) df.index = new_index
方法3:直接重建MultiIndex
如果每个日期对应的Time数量和顺序完全固定,也可以直接生成目标的MultiIndex,然后替换原索引,这种方法最直接:
# 获取所有唯一的日期 unique_dates = df.index.get_level_values('Date').unique() # 生成目标Time序列 target_times = pd.date_range('0:00', '2:00', freq='15T').time # 重新构造MultiIndex new_index = pd.MultiIndex.from_product([unique_dates, target_times], names=['Date', 'Time']) # 替换原索引(因为数据顺序完全匹配,直接替换即可) df.index = new_index
这三种方法都能得到你想要的结果,你可以根据自己的数据集大小和使用习惯来选~
内容的提问来源于stack exchange,提问作者jerry han
相关产品推荐
相关产品推荐

