【问题标题】:Averaging over specific months in pandas大熊猫特定月份的平均值
【发布时间】:2019-01-24 23:11:06
【问题描述】:

我无法使用 pandas 创建平均值。我的问题是我想为每个冬天创建结合 11 月、12 月、1 月、2 月、3 月的平均值,但是它们属于不同的年份,因此我不能只对一个日历内的这些值进行平均年。我尝试将数据子集到两个日期时间对象中作为..

nd_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([11,12])]
jfm_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([1,2,3])]

..但是我在操作日期(年)以进行简单的平均时遇到了麻烦。我对熊猫没有经验,想知道是否有比导出到 excel 和更改年份更优雅的方法!数据的形式是..

Date    
1899-01-01 00:00:00 100994.0
1899-02-01 00:00:00 100932.0
1899-03-01 00:00:00 100978.0
1899-11-01 00:00:00 100274.0
1899-12-01 00:00:00 100737.0
1900-01-01  100655.0
1900-02-01  100633.0 
1900-03-01  100512.0
1900-11-01  101212.0
1900-12-01  100430.0

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    有趣的问题。由于您平均超过五个月,这使得重新采样更加棘手。您应该能够通过逻辑索引和构建新的数据框来克服这个问题。我假设您的索引是日期时间值。

    index = pd.date_range('1899 9 1', '1902, 3, 1', freq='1M')
    data = np.random.randint(0, 100, (index.size, 5))
    df = pd.DataFrame(index=index, data=data, columns=list('ABCDE'))
    
    # find rows that meet your criteria and average
    idx1 = (df.index.year==1899) & (df.index.month >10)
    idx2 = (df.index.year==1900) & (df.index.month < 4)
    
    winterAve = df.loc[idx1 | idx2, :].mean(axis=0)
    

    只是为了直观地检查索引/切片是否在做我们需要的事情......

    >>>df.loc[idx1 | idx2, :]
    Out[200]: 
                 A   B   C   D   E
    1899-11-30  48  91  87  29  47
    1899-12-31  63   5   0  35  22
    1900-01-31  37   8  89  86  38
    1900-02-28   7  35  56  63  46
    1900-03-31  72  34  96  94  35
    

    您应该能够将其放入 for 循环中以迭代多年,等等。

    【讨论】:

    • 这几乎行得通!但是由于输出中的日期是当月的最后几天,它返回 NaN 作为值,因为我所有的值都是在月初设置的。我不确定这是在哪里设置的...你知道调整它的方法吗?
    • 啊哈!它通过设置 freq = '1MS' 而不是 '1M' 来解决。欢呼
    • 好收获。很高兴它成功了。如果您对此感到满意,请随意将其设为可接受的答案。
    【解决方案2】:

    使用 pd.Grouper 按月对数据进行分组

    g = df.groupby(pd.Grouper(freq="M"))  # DataFrameGroupBy (grouped by Month)
    

    对于每个组,仅计算“A”列的平均值

    monthly_averages = g.aggregate({"A":np.mean})
    

    【讨论】:

    • OP 希望平均多个月的数据,而不仅仅是一个月内的数据。
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2015-07-18
    • 2018-01-29
    • 1970-01-01
    • 2017-09-12
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多