【问题标题】:Pandas .resample to get mean valuesPandas .resample 获取平均值
【发布时间】:2020-10-05 16:32:47
【问题描述】:

我想通过使用带有“mean”方法的 pandas .resample 函数将 15 分钟数据重新采样为 60 分钟数据,但默认情况下,此方法取原始值和 3 个下一个值的平均值。有没有办法取原始值和前 3 个值的平均值?

输入数据(实际上输入数据是365天):

Generated On                CB_P
2019-01-01 08:15:00+00:00   0.187
2019-01-01 08:30:00+00:00   0.228
2019-01-01 08:45:00+00:00   0.242
2019-01-01 09:00:00+00:00   0.8270
2019-01-01 09:15:00+00:00   1.083
2019-01-01 09:30:00+00:00   3.022
2019-01-01 09:45:00+00:00   1.511
2019-01-01 10:00:00+00:00   1.568
2019-01-01 10:15:00+00:00   6.365
2019-01-01 10:30:00+00:00   8.23
2019-01-01 10:45:00+00:00   9.3
2019-01-01 11:00:00+00:00   14.311
2019-01-01 11:15:00+00:00   13.045
2019-01-01 11:30:00+00:00   11.05
2019-01-01 11:45:00+00:00   11.257
2019-01-01 12:00:00+00:00   13.367
2019-01-01 12:15:00+00:00   11.895
2019-01-01 12:30:00+00:00   9.245
2019-01-01 12:45:00+00:00   7.254
2019-01-01 13:00:00+00:00   15.773
2019-01-01 13:15:00+00:00   14.280
2019-01-01 13:30:00+00:00   17.258
2019-01-01 13:45:00+00:00   7.792
2019-01-01 14:00:00+00:00   6.893
2019-01-01 14:15:00+00:00   4.693
2019-01-01 14:30:00+00:00   4.271
2019-01-01 14:45:00+00:00   1.524
2019-01-01 15:00:00+00:00   1.495
2019-01-01 15:15:00+00:00   1.03
2019-01-01 15:30:00+00:00   0.364
2019-01-01 15:45:00+00:00   0.045

预期输出:

Generated On                CB_P
2019-01-01 09:00:00+00:00   0.371
2019-01-01 10:00:00+00:00   1.796
2019-01-01 11:00:00+00:00   9.5515
2019-01-01 12:00:00+00:00   12.180
2019-01-01 13:00:00+00:00   11.04
2019-01-01 14:00:00+00:00   11.556
2019-01-01 15:00:00+00:00   2.996

【问题讨论】:

  • 这能回答你的问题吗? Resampling Minute data 即:df.resample('60Min', on='Generated On').mean()
  • 该链接中的主题是关于从不同的时间开始,但这不是我想要完成的。

标签: python pandas


【解决方案1】:

试试这个:

df.groupby(df['Generated On'].hour)[['CB_P']].mean()

【讨论】:

  • 我忘了说我的数据不只是 1 天,而是 365 天(现在编辑),所以这个方法对我不起作用。
【解决方案2】:

这个呢?您基本上在原始 datetime 列上应用 15 分钟偏移量,然后在 resample 上应用。您可以构建多个集合或自定义函数。

我正在使用pandas==1.1.3df_Agg2 应该是你所追求的。

import pandas as pd
import scipy.stats as stats
from datetime import timedelta


df = pd.read_csv(r't1.csv')
df['Generated On'] = pd.to_datetime( df['Generated On'] )
df['datetime_Adj'] = df['Generated On'] - timedelta(minutes=15)

lambda0 = lambda x: stats.mode(x)[0]
lambda1 = lambda x: x.max() - x.min()

##########################################################################

df_Agg1 = df.resample(rule='1H', on='Generated On').apply({ 
                'CB_P': ['sum', 'mean', 'min', 'max', lambda0, lambda1 ], 
                })

# Rename the columns
df_Agg1.columns = ['_'.join(pair) for pair in df_Agg1.columns]
df_Agg1.reset_index(inplace=True)

##########################################################################

df_Agg2 = df.resample(rule='1H', on='datetime_Adj').apply({ 
                'CB_P': ['sum', 'mean', 'min', 'max', lambda0, lambda1 ], 
                })

# Rename the columns
df_Agg2.columns = ['_'.join(pair) for pair in df_Agg2.columns]
df_Agg2.reset_index(inplace=True)

##########################################################################

【讨论】:

    【解决方案3】:

    告诉resample 提前 45 分钟开始每个周期:

    r = df.resample('1H', offset=pd.Timedelta("-00:45:00")).mean()
    

    这会产生正确的均值,但会产生不正确的(移位的)索引。通过将其向前移动 45 分钟来修复它:

    r.index += pd.Timedelta("00:45:00")
    #                                CB_P
    #Generated On                        
    #2019-01-01 09:00:00+00:00   0.371000
    #2019-01-01 10:00:00+00:00   1.796000
    #2019-01-01 11:00:00+00:00   9.551500
    #2019-01-01 12:00:00+00:00  12.179750
    #2019-01-01 13:00:00+00:00  11.041750
    #2019-01-01 14:00:00+00:00  11.555750
    #2019-01-01 15:00:00+00:00   2.995750
    #2019-01-01 16:00:00+00:00   0.479667
    

    【讨论】:

      猜你喜欢
      • 2014-09-23
      • 2020-03-09
      • 1970-01-01
      • 2022-08-14
      • 2020-05-16
      • 2021-07-13
      • 2018-10-02
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多