从 pandas 数据框创建气候学(按年附加平均值)

Create climatology from pandas dataframe (append the mean by day-of-year)

import pandas as pd
import pdb, random

dates = pd.date_range('1950-01-01', '1953-12-31', freq='D')
data  = [int(1000*random.random()) for i in xrange(len(dates))]
cum_data = pd.Series(data, index=dates)

cum_data.head()
    1950-01-01    310
    1950-01-02    477
    1950-01-03    401
    1950-01-04    896
    1950-01-05     65
...
    1951-01-01    320
...
    1952-01-01    330
...
    1953-01-01    340

# Compute climatology
cum_data.groupby([cum_data.index.month, cum_data.index.day]).mean()

我想计算此数据框的气候学,即找到与 1 月 1 日(1950 年至 1953 年)对应的所有值的平均值,然后将平均值附加到从 1 月开始的时间段的数据框1954 年 1 日至 1960 年 12 月 31 日。我该怎么做?

预期输出应该是 1950 年到 1953 年的原始数据集。1954 年 1 月 1 日应该是 1950 年 1 月 1 日、1951 年、1952 年、1953 年的平均值。在这种情况下:

    1954-01-01    325
...
    1955-01-01    325
...
...
    1960-01-01    325

所以, 1954 年 1 月 1 日将等于 1955 年 1 月 1 日 ... 1960 年 1 月 1 日。这也适用于所有其他日期。

您可以在一年内使用 resample 函数 AS

In [8]: cum_data.resample('AS', how='mean')
Out[8]:
1950-01-01    502.169863
1951-01-01    503.698630
1952-01-01    503.185792
1953-01-01    504.961644
Freq: AS-JAN, dtype: float64

将此结果存入tmp

In [9]: tmp = cum_data.resample('AS', how='mean')

将索引更改为所需的时间范围

In [10]: tmp.index = (pd.date_range('1954-01-01', '1957-01-01', freq='AS'))

In [11]: tmp
Out[11]:
1954-01-01    502.169863
1955-01-01    503.698630
1956-01-01    503.185792
1957-01-01    504.961644
Freq: AS-JAN, dtype: float64

也填写每天的日期。

In [12]: tmp = tmp.reindex(pd.date_range('1954-01-01', '1957-12-31', freq='D')).ffill()

In [13]: tmp.head()
Out[13]:
1954-01-01    502.169863
1954-01-02    502.169863
1954-01-03    502.169863
1954-01-04    502.169863
1954-01-05    502.169863
Freq: D, dtype: float64

然后追加到cum_data

In [14]: cum_data.append(tmp)
Out[14]:
1950-01-01    430
1950-01-02    125
1950-01-03    371
1950-01-04    906
1950-01-05    504
...
1957-12-28    504.961644
1957-12-29    504.961644
1957-12-30    504.961644
1957-12-31    504.961644
Length: 2922