Pandas datetime multiindex更改为日期索引和时间列(使用reindex)

时间:2017-04-26 12:52:02

标签: python pandas multi-index

设置: 我有像这样的多索引数据框数据;

                                                     value
date                      date                               
2015-08-13 00:00:00+10:00 2015-08-13 06:30:00+10:00  0.812689
                          2015-08-13 15:30:00+10:00  0.054290
                          2015-08-13 16:00:00+10:00  0.206277
                          2015-08-13 16:30:00+10:00  0.082520
                          2015-08-13 17:00:00+10:00  0.009448
                          2015-08-13 17:30:00+10:00  0.000000
2015-08-14 00:00:00+10:00 2015-08-14 06:30:00+10:00  0.000000
                          2015-08-14 07:00:00+10:00  0.000280
                          2015-08-14 07:30:00+10:00  0.034119
                          2015-08-14 08:00:00+10:00  0.168524
                          2015-08-14 08:30:00+10:00  0.471783
                          2015-08-14 09:00:00+10:00  0.522409

作为临时步骤,我将第一个索引级别设为仅仅是日期,将第二个索引级别设为仅仅是时间,我已经完成了,

# set index level 0 to dates
day_start=[i.date() for i in data.index.levels[0]]
data.index.set_levels(day_start, level=0, inplace=True)

# set index level 1 to times
interval_start=[i.time() for i in data.index.levels[1]]
data_interval.index.set_levels(interval_start, level=1, inplace=True)

# rename time index
data.index.set_names('time', level=1, inplace=True)

也许不是最好的方法,但它给出了,

                        value
date       time              
2015-08-13 06:30:00  0.812689
           15:30:00  0.054290
           16:00:00  0.206277
           16:30:00  0.082520
           17:00:00  0.009448
           17:30:00  0.000000
2015-08-14 06:30:00  0.000000
           07:00:00  0.000280
           07:30:00  0.034119
           08:00:00  0.168524
           08:30:00  0.471783
           09:00:00  0.522409

问题:我接下来无法做的是重新索引时间,因此从00:00到23:30每隔30分钟就有一个索引,零填充缺少数据。这将使每天都保持一致,这可能与数据有不同的开始/结束时间。即。

                     value
date       time              
2015-08-13 00:00:00  0.0
           00:30:00  0.0
              :
           06:30:00  0.812689
           07:00:00  0.0
           07:30:00  0.0
              :
           15:30:00  0.054290
           16:00:00  0.206277
           16:30:00  0.082520
              :
           23:30:00  0.0

等等每一天。尝试在level = 1上重新索引似乎在传递30分钟间隔时间的数组时没有效果。不确定这是否是正确的方法。

下一步:我想在之后执行,即data.unstack(level = 1),以便所有时间索引成为列标题。如果我将它拆开,我会在重复的时间内得到一个奇怪的混合列(这主要是为什么我试图让它们在几天之间保持一致)。喜欢的东西;

            value                                                          
time        06:30:00 15:30:00  16:00:00 16:30:00  17:00:00 17:30:00 06:30:00   
date                                                                           
2015-08-13  0.812689  0.05429  0.206277  0.08252  0.009448      0.0      0.0  
2015-08-14  0.000000  0.00000  0.000000  0.00000  0.000000      0.0      0.0   
2015-08-15  0.000000  0.00000  0.000000  0.00000  0.000000      0.0      0.0
2015-08-16  0.000000  0.00000  0.000000  0.00000  0.000000      0.0      0.0   
2015-08-17  0.000000  0.00000  0.000000  0.00000  0.000000      0.0      0.0

那些日子里有很多缺失的数据,所以它没有进入我猜的正确列。我可能从根本上在重新索引中遗漏了一些东西,也许我的整个方法不是获得最终结果的方法。

1 个答案:

答案 0 :(得分:2)

首先,只需丢弃“日期”列。这是多余的,并且伤害超过它有帮助。那是df.index = df.index.droplevel(0)

现在你有了这个:

                        value
time                         
2015-08-13 06:30:00  0.812689
2015-08-13 15:30:00  0.054290
2015-08-13 16:00:00  0.206277
2015-08-13 16:30:00  0.082520
2015-08-13 17:00:00  0.009448
2015-08-13 17:30:00  0.000000
2015-08-14 06:30:00  0.000000
2015-08-14 07:00:00  0.000280
2015-08-14 07:30:00  0.034119
2015-08-14 08:00:00  0.168524
2015-08-14 08:30:00  0.471783
2015-08-14 09:00:00  0.522409

然后,df.resample('30min').first().fillna(0)

                        value
time                         
2015-08-13 06:30:00  0.812689
2015-08-13 07:00:00  0.000000
2015-08-13 07:30:00  0.000000
2015-08-13 08:00:00  0.000000
...

现在将索引拆分为单独的日期和时间部分:

df['date'] = df.index.date
df['time'] = df.index.time

最后,枢轴:

df.pivot(values='value', index='date', columns='time')