【问题标题】:Efficient aggregation over time index in PandasPandas 中随时间推移的高效聚合索引
【发布时间】:2019-03-19 18:27:31
【问题描述】:

我有每周格式的数据,我想以有效的方式汇总到每月级别。我目前正在做的是将 DataFrame 从几周重新索引到几天,然后在每个月的几天内取平均值。这种方法很慢,尤其是在我处理大数据时。我正在寻找更有效的方法。

简化示例

每周数据:

dates = ['2018-8-20','2018-8-27','2018-9-10']
values = [1,2,3]

df = pd.Series(values, index=pd.to_datetime(dates))
df.index.name = 'week'
df.name = 'val'

变成每天(注意我是向前填充空值):

date_list = [df.index.min() + datetime.timedelta(days=x) for x in range(0, (df.index.max()-df.index.min()).days+1)]
dfDaily = df.reindex(date_list)
dfDaily=  dfDaily.fillna(method='ffill')

dfDaily = pd.DataFrame(dfDaily)
dfDaily['month'] = dfDaily.index.month
dfDaily['year'] = dfDaily.index.year

给出:

            val  month  year
week                        
2018-08-20  1.0      8  2018
2018-08-21  1.0      8  2018
2018-08-22  1.0      8  2018
2018-08-23  1.0      8  2018
2018-08-24  1.0      8  2018
2018-08-25  1.0      8  2018
2018-08-26  1.0      8  2018
2018-08-27  2.0      8  2018
2018-08-28  2.0      8  2018
2018-08-29  2.0      8  2018
2018-08-30  2.0      8  2018
2018-08-31  2.0      8  2018
2018-09-01  2.0      9  2018
2018-09-02  2.0      9  2018
2018-09-03  2.0      9  2018
2018-09-04  2.0      9  2018
2018-09-05  2.0      9  2018
2018-09-06  2.0      9  2018
2018-09-07  2.0      9  2018
2018-09-08  2.0      9  2018
2018-09-09  2.0      9  2018
2018-09-10  3.0      9  2018    

按月汇总:

dfMonthly = dfDaily.groupby(['year', 'month']).val.mean().reset_index()

产生所需的 DataFrame:;

   year  month       val
0  2018      8  1.416667
1  2018      9  2.100000

【问题讨论】:

    标签: python-3.x pandas datetime dataframe python-datetime


    【解决方案1】:

    您可以简化您的解决方案,但不确定性能是否会大幅提升:

    date_list = pd.date_range(df.index.min(), df.index.max(), freq='d')
    s = df.reindex(date_list, method='ffill')
    
    dfDaily = s.groupby([s.index.year.rename('year'),
                         s.index.month.rename('month')]).mean().reset_index()
    print (dfDaily)
       year  month       val
    0  2018      8  1.416667
    1  2018      9  2.100000
    

    【讨论】:

    • 是的,它的速度大约是原来的 3 倍
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2019-04-29
    • 2017-07-18
    相关资源
    最近更新 更多