调整年度数据

Alf*_* M. 2 python time-series pandas

从一年中在一天中不同时间测得的温度的多年记录开始,我希望得出一个矩形的每日平均值数组,每一行代表一年的数据。

数据看起来像这样

temperature.head()

date
1996-01-01 00:00:00     7.39
1996-01-01 03:00:00     6.60
1996-01-01 06:00:00     7.39
1996-01-01 09:00:00     9.50
1996-01-01 12:00:00    11.00
Name: temperature, dtype: float64
Run Code Online (Sandbox Code Playgroud)

我用

import pandas as pd
daily = temperature.groupby(pd.TimeGrouper(freq='D')).mean()
Run Code Online (Sandbox Code Playgroud)

哪个产量

daily.head()

date
1996-01-01     9.89625
1996-01-02    10.73625
1996-01-03     6.98500
1996-01-04     5.62250
1996-01-05     8.84625
Freq: D, Name: temperature, dtype: float64
Run Code Online (Sandbox Code Playgroud)

现在对于最后一部分,我想到了类似

yearly_daily_mean = daily.groupby(pd.TimeGrouper(freq='12M', closed="left"))
Run Code Online (Sandbox Code Playgroud)

但是这里有一些问题。

  1. 我需要删除未填充整整一年的数据的尾部。
  2. 如果缺少数据怎么办?
  3. 如何应对the年?
  4. 你下一步怎么做?也就是说,如何“堆叠”(以numpy的方式,而不是熊猫的意义)数据的年份?

我在用

array_temperature = np.column_stack([group[1] for group in yearly_daily_mean if len(group[1]) == 365])
Run Code Online (Sandbox Code Playgroud)

但是应该有更好的方法。

作为一个附属问题,我如何选择数据年份的开始日期?

jor*_*ris 5

如果我对您的理解正确,则希望将每日均值(已经计算过)的时间序列重塑为一个矩形数据框,其中不同的天为列,不同的年为行。
这可以通过熊猫重塑功能轻松实现,例如pivot

一些伪数据:

In [45]: index = pd.date_range(start=date(1996, 1,1), end=date(2010, 6, 30), freq='D')

In [46]: daily = pd.DataFrame(index=index, data=np.random.random(size=len(index)), columns=['temperature'])
Run Code Online (Sandbox Code Playgroud)

首先,我添加带有年份和年份的列:

In [47]: daily['year'] = daily.index.year

In [48]: daily['day'] = daily.index.dayofyear

In [49]: daily.head()
Out[49]:
            temperature  year  day
1996-01-01     0.081774  1996    1
1996-01-02     0.694968  1996    2
1996-01-03     0.478050  1996    3
1996-01-04     0.123844  1996    4
1996-01-05     0.426150  1996    5
Run Code Online (Sandbox Code Playgroud)

现在,我们可以重塑此数据框:

In [50]: daily.pivot(index='year', columns='day', values='temperature')
Out[50]:
day        1         2      ...          365       366
year                        ...
1996  0.081774  0.694968    ...     0.679461  0.700833
1997  0.043134  0.981707    ...     0.009357       NaN
1998  0.257077  0.297290    ...     0.701941       NaN
...        ...       ...    ...          ...       ...
2008  0.047145  0.750354    ...     0.996396  0.761159
2009  0.348667  0.827057    ...     0.881424       NaN
2010  0.269743  0.872655    ...          NaN       NaN

[15 rows x 366 columns]
Run Code Online (Sandbox Code Playgroud)