从当天不同时间测量的多年温度记录开始,我想得到一个矩形的日平均数,每行代表一年的数据 .
数据看起来像这样
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
我计算了每日平均值
import pandas as pd
daily = temperature.groupby(pd.TimeGrouper(freq='D')).mean()
哪个收益率
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
现在最后一部分我想到了类似的东西
yearly_daily_mean = daily.groupby(pd.TimeGrouper(freq='12M', closed="left"))
但这里有一些问题 .
-
我需要放弃数据的尾部而不是一整年 .
-
如果数据丢失会怎样?
-
如何应对闰年?
-
下一步是什么?也就是说,如何“堆叠”(在numpy 's, not pandas'意义上)多年的数据?
我在用
array_temperature = np.column_stack([group[1] for group in yearly_daily_mean if len(group[1]) == 365])
但应该有更好的方法 .
作为附属问题,我如何选择数据年份的开始日期?
3 回答
如果我理解正确,您希望将日常工作的时间序列(已经计算过)重新整形为矩形数据框,其中不同的日期为列,不同的年份为行 .
这可以通过pandas整形功能轻松实现,例如使用pivot:
一些虚拟数据:
首先,我添加一年中和每年的列:
现在,我们可以重塑这个数据帧:
我就是这样做的 . 非常简单:用你想要的确切形状创建一个新的df,然后用你想要的东西填充它 .
如果你不希望最后的df在第366天有任何空值,那么你可以删除最后的if语句,然后重写
columns2 = range(1,366)
,然后df2将拥有所有非空值(假设至少有在观察到的时间段内每天进行一次测量) .假设您已经从高频数据中获得每日平均值(包含
pd.DateTimeIndex
),原因如下:IIUC,您希望将每日平均值转换为
DataFrame
,每行具有相同数量的列以捕获年度数据 . 当瞄准相同数量的列时,你提到闰年是一个潜在的问题 .我可以想象两种方法:
选择每个
row
的天数 - 可能为365.为每个row
选择365个连续每日数据点的滚动块,并为每个块对齐index
.选择多年的数据,填补闰年的空白,并按
MM-DD
或一年中的天数对齐 .以20年半的每日随机
data
作为模拟日平均温度:这是第一种方法的解决方案:
使用
.groupby(pd.TimeGrouper('365D'))
连续365天选择块,并将每个平均每个平均值的groupby
对象返回pd.DataFrame
,每个序列从0
到364
运行integer
index
:要对齐21个数据块,只需转置
pd.DataFrame
,它们将在columns, with the start date of each sequence in the
index. This operation will produce an extra
index, and the last
index中对齐integer
index将有一些丢失的数据 . 清理两者:得到
[20 x 365]
DataFrame
如下:如果您只想收集数据的年份并按日期对齐,那么非闰年的缺失日期大约为60(而不是366),您可以: