熊猫日期时间多指标改变为日期索引和时间的字段(重新索引)

问题描述:

设置: 我有一个多指标数据帧数据这样;熊猫日期时间多指标改变为日期索引和时间的字段(重新索引)

             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每30分钟至23:30,其中z eros填入缺少的数据。这将使其每天都保持一致,这可能与数据具有不同的开始/结束时间。即

     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(等级= 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 

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

首先,放弃“日期”列。这是多余的,伤害更多,而不是帮助。那是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') 
+1

谢谢!到目前为止,这工作非常好。将12行代码(和增长代码)缩减为更优雅的4行。我没有在resample中使用first() - 我没有提到这个,但原始数据是每5分钟一次,所以resample('30min')。sum()在这里完美。此外df.pivot抱怨重复的索引条目,但使用pivot_table似乎避免了这一点。 – Paul