![](/img/trans.png)
[英]In Pandas, generate DateTime index from Multi-Index with years and weeks
[英]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.