【问题标题】:Pandas datetime multiindex changed to date index and time columns (with reindex)Pandas 日期时间多索引更改为日期索引和时间列(使用重新索引)
【发布时间】:2017-04-26 12:52:02
【问题描述】:

设置: 我有一个像这样的多索引数据框 data

                                                     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

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

下一步:我想在 之后做 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

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

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    首先,丢弃“日期”列。它是多余的,而且伤害大于帮助。那是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')
    

    【讨论】:

    • 谢谢!到目前为止,这工作得很好。将 12 行(并且还在增长)的代码减少到更优雅的 4 行。虽然我没有在重采样中使用 first() - 我没有提到这一点,但原始数据是每 5 分钟一次,所以 resample('30min').sum() 在这里是完美的。 df.pivot 还抱怨索引条目重复,但使用 pivot_table 似乎可以避免这种情况。
    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 2014-03-07
    • 2021-12-09
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多