首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有MultiIndex的Pandas DataFrame : DateTime级别值的年份分组

带有MultiIndex的Pandas DataFrame : DateTime级别值的年份分组
EN

Stack Overflow用户
提问于 2016-01-26 01:18:20
回答 2查看 2.7K关注 0票数 5

我有一个多索引的and dataframe,看起来像这样:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd

# multi-indexed dataframe
df = pd.DataFrame(np.random.randn(8760 * 3, 3))
df['concept'] = "some_value"
df['datetime'] = pd.date_range(start='2016', periods=len(df), freq='60Min')
df.set_index(['concept', 'datetime'], inplace=True)
df.sort_index(inplace=True)

控制台输出:

代码语言:javascript
复制
df.head()
Out[23]: 
                 0         1         2
datetime                              
2016      0.458802  0.413004  0.091056
2016     -0.051840 -1.780310 -0.304122
2016     -1.119973  0.954591  0.279049
2016     -0.691850 -0.489335  0.554272
2016     -1.278834 -1.292012 -0.637931

df.head()
    ...: df.tail()

Out[24]: 
                 0         1         2
datetime                              
2018     -1.872155  0.434520 -0.526520
2018      0.345213  0.989475 -0.892028
2018     -0.162491  0.908121 -0.993499
2018     -1.094727  0.307312  0.515041
2018     -0.880608 -1.065203 -1.438645

现在我想沿着“datetime”级别创建年度总和。

我的第一次尝试是这样的,但这不起作用:

代码语言:javascript
复制
# sum along years
years = df.index.get_level_values('datetime').year.tolist()
df.index.set_levels([years], level=['datetime'], inplace=True)
df = df.groupby(level=['datetime']).sum()

而且这对我来说似乎也很重,因为这项任务可能很容易实现。

所以我的问题是:如何才能获得“日期时间”级别的年度总和?有没有一种简单的方法可以通过将函数应用于DateTime级别的值来实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-26 01:44:19

您可以按第二级multiindexyear进行groupby

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd

# multi-indexed dataframe
df = pd.DataFrame(np.random.randn(8760  * 3, 3))
df['concept'] = "some_value"
df['datetime'] = pd.date_range(start='2016', periods=len(df), freq='60Min')
df.set_index(['concept', 'datetime'], inplace=True)
df.sort_index(inplace=True)
print df.head() 
                                       0         1         2
concept    datetime                                         
some_value 2016-01-01 00:00:00  1.973437  0.101535 -0.693360
           2016-01-01 01:00:00  1.221657 -1.983806 -0.075609
           2016-01-01 02:00:00 -0.208122 -2.203801  1.254084
           2016-01-01 03:00:00  0.694332 -0.235864  0.538468
           2016-01-01 04:00:00 -0.928815 -1.417445  1.534218

# sum along years
#years = df.index.get_level_values('datetime').year.tolist()
#df.index.set_levels([years], level=['datetime'], inplace=True)

print df.index.levels[1].year
[2016 2016 2016 ..., 2018 2018 2018]
df = df.groupby(df.index.levels[1].year).sum()
print df.head()
               0           1          2
2016  -93.901914  -32.205514 -22.460965
2017  205.681817   67.701669 -33.960801
2018   67.438355  150.954614 -21.381809

或者,您可以使用get_level_valuesyear

代码语言:javascript
复制
df = df.groupby(df.index.get_level_values('datetime').year).sum()
print df.head()
               0           1          2
2016  -93.901914  -32.205514 -22.460965
2017  205.681817   67.701669 -33.960801
2018   67.438355  150.954614 -21.381809
票数 4
EN

Stack Overflow用户

发布于 2016-01-26 01:37:49

从您的示例数据开始:

代码语言:javascript
复制
df = pd.DataFrame(np.random.randn(8760 * 3, 3))
df['concept'] = "some_value"
df['datetime'] = pd.date_range(start='2016', periods=len(df), freq='60Min')
df.set_index(['concept', 'datetime'], inplace=True)

您可以将groupby应用于MultiIndexlevel

代码语言:javascript
复制
df.groupby(pd.TimeGrouper(level='datetime', freq='A')).sum()

要获得以下信息:

代码语言:javascript
复制
                     0          1          2
datetime                                    
2016-12-31  100.346135 -71.673222  42.816675
2017-12-31 -132.880909 -66.017010 -73.449358
2018-12-31  -71.449710 -15.774929  97.634349

pd.TimeGrouper现在已弃用(0.23);请改用pd.Grouper(freq=...)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34998392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档