Python 按小时和分钟分组后创建新索引(或连接多索引的两个级别)

Python 按小时和分钟分组后创建新索引(或连接多索引的两个级别),python,pandas,datetime,pandas-groupby,multi-index,Python,Pandas,Datetime,Pandas Groupby,Multi Index,,您可以按日期时间而不是日期时间本身对日期进行分组: import pandas as pd import numpy as np dr = pd.date_range('01-01-2020', '01-03-2020', freq='30T') df = pd.DataFrame(np.random.rand(len(dr)), index=dr) df = df.groupby([df.index.hour, df.index.minute]).sum() 这将按预期聚合数据,但返回一

,您可以按日期时间而不是日期时间本身对日期进行分组:

import pandas as pd
import numpy as np

dr = pd.date_range('01-01-2020', '01-03-2020', freq='30T')
df = pd.DataFrame(np.random.rand(len(dr)), index=dr)
df = df.groupby([df.index.hour, df.index.minute]).sum()
这将按预期聚合数据,但返回一个多索引数据帧,其中一个级别为未标记的小时,另一个级别为未标记的分钟:

              0
0  0   1.383863
   30  1.293589
1  0   0.545617
   30  0.208717
2  0   0.464892
   30  0.392486
...
我想创建一个新的索引,它将时间表示为字符串或实际的
datetime.time()
。我可以将时间输入字符串,执行如下操作:

hours = df.index.get_level_values(0).astype(str).str.pad(2, fillchar='0')
minutes = df.index.get_level_values(1).astype(str).str.pad(2, fillchar='0')
new = hours + ':' + minutes
df = df.set_index(new, drop=True)
df.index.name = 'time'
输出:

              0
time           
00:00  1.203189
00:30  1.943932
01:00  1.671113
01:30  1.640122
02:00  1.240969
02:30  0.687489
...
这是可行的,但却是一组非常繁琐的命令。我的问题是:

  • 有没有更简单的方法将这个多索引转换为组合字符串版本
  • 如何将多索引转换为
    datetime.time()
    ?我知道我可以将原始索引转换为
    df.index=df.index.time
    ,但我还没有找到一种方法,可以从一个索引级别获取小时,从另一个索引级别获取分钟,以获得
    时间
    对象
  • 要将字符串分组,请执行以下操作:

    import pandas as pd
    import numpy as np
        
    dr = pd.date_range('01-01-2020', '01-03-2020', freq='30T')
    df = pd.DataFrame(np.random.rand(len(dr)), index=dr)
    df = df.groupby(df.index.strftime('%H:%M')).sum()
    df.index.name = 'time'
    
    或者要分组到
    datetime.time
    ,请将
    groupby
    行替换为:

    df = df.groupby(df.index.strftime(df.index.time)).sum()