繁体   English   中英

Pandas 按日期时间多索引级别的时间分组

[英]Pandas group by time of day from Datetime multi-index level

我有一个带有多索引的数据框,其中包含一个名为datetime的级别,它是一个DatetimeIndex 我想按一天中的时间对我的数据进行分组。 通过这样做是否惯用

df.groupby(df.index.get_level_values('datetime').time).something()

? 我问是因为我不喜欢这里的.get_level_values('datetime')部分。 特别是:如果datetime时间不是索引的一部分,我可以更轻松地编写

df.groupby(df.datetime.dt.time).something()

在我的印象中,将列视为索引的目的是使此类操作更直接,所以我很惊讶这里的情况正好相反。

编辑:我意识到如果我可以轻松地将datetime级别拆分为date级别和time级别,我可以做到

# change df.index to have levels [date, time, x, y, z] instead of [datetime, x, y, z]
df.groupby(level='time').something()

这看起来非常简洁,所以如果拆分可以优雅地完成,那也可以回答我的问题。

通过这样做是否惯用

df.groupby(df.index.get_level_values('datetime').time).median()

?

我想是的,如果想要MultiIndex级别的属性,就像这里DatetimeIndex.time和级别名称。

您还可以按位置使用选择级别 - 这里是第一级:

df.groupby(df.index.get_level_values(0).time).median()

您的编辑解决方案应该简化:

df.groupby(level='time').median()
df.groupby(level=1).median()
#some functions like sum, mean, median
df.median(level=1)

编辑:

如果可能,最简单的是将值拆分为日期和时间,然后创建MultiIndex

df = pd.DataFrame({
        'datetime': pd.to_datetime(['2000-01-05 15:00:00'] * 3 + ['2000-01-06'] * 3),
         'x':[4,5,4,5,5,4],
         'y':[7] * 6,
         'z':[1,3] * 3,
         'col':[5,3,6,9,2,4]
})

df['date'] = df['datetime'].dt.date
df['time'] = df['datetime'].dt.time

df = df.set_index(['date','time','x','y','z']).drop('datetime', axis=1)
print (df)
                           col
date       time     x y z     
2000-01-05 15:00:00 4 7 1    5
                    5 7 3    3
                    4 7 1    6
2000-01-06 00:00:00 5 7 3    9
                        1    2
                    4 7 3    4
                    

如果输入数据在MultiIndex已经有datetimeindex

df1 = pd.DataFrame({
        'datetime': pd.to_datetime(['2000-01-05 15:00:00'] * 3 + ['2000-01-06'] * 3),
         'x':[4,5,4,5,5,4],
         'y':[7] * 6,
         'z':[1,3] * 3,
         'col':[5,3,6,9,2,4]
}).set_index(['datetime','x','y','z'])

print (df1)
                           col
datetime            x y z     
2000-01-05 15:00:00 4 7 1    5
                    5 7 3    3
                    4 7 1    6
2000-01-06 00:00:00 5 7 3    9
                        1    2
                    4 7 3    4

names = ['date','time','x','y','z']
df1.index = pd.MultiIndex.from_tuples([(d.date(), d.time(),a,b,c) 
                                       for d,a,b,c in df1.index], names=names)
print (df1)
                           col
date       time     x y z     
2000-01-05 15:00:00 4 7 1    5
                    5 7 3    3
                    4 7 1    6
2000-01-06 00:00:00 5 7 3    9
                        1    2
                    4 7 3    4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM