从 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
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