Python 在多索引中重新采样会丢失值
我有一些从2003年到2011年的分层数据,这些数据从最底层变成了时间序列数据,如下所示:Python 在多索引中重新采样会丢失值,python,pandas,time-series,multi-index,Python,Pandas,Time Series,Multi Index,我有一些从2003年到2011年的分层数据,这些数据从最底层变成了时间序列数据,如下所示: polar_temp Station_Number Date Value 417 CA002100805 20030101 -296 423 CA002202570 20030101 -269 425 CA002203058 20030101 -268 427 CA002300551 2003
polar_temp
Station_Number Date Value
417 CA002100805 20030101 -296
423 CA002202570 20030101 -269
425 CA002203058 20030101 -268
427 CA002300551 20030101 -23
428 CA002300902 20030101 -200
我在站点编号和日期上设置了多个索引:
polar_temp['Date'] = pd.to_datetime(polar_temp['Date'],
format='%Y%m%d')#.dt.strftime("%Y-%m-%d")
polar_temp = polar_temp.set_index(['Station_Number', "Date"])
Value
Station_Number Date
CA002100805 2003-01-01 -296
CA002202570 2003-01-01 -269
CA002203058 2003-01-01 -268
CA002300551 2003-01-01 -23
CA002300902 2003-01-01 -200
现在,我想通过使用以下公式计算每8天的平均值,对数据进行重新采样:
polar_temp8d = polar_temp.groupby([pd.Grouper(level='Station_Number'),
pd.Grouper(level='Date', freq='8D')]).mean()
Value
Station_Number Date
CA002100805 2003-01-01 -300.285714
2003-01-09 -328.750000
2003-01-17 -325.500000
2003-01-25 -385.833333
2003-02-02 -194.428571
... ...
USW00027515 2005-06-23 76.625000
2005-07-01 42.375000
2005-07-09 94.500000
2005-07-17 66.500000
2005-07-25 56.285714
所以这里的问题是大熊猫只对2003年到2005年的年份进行了重采样,所以2006年到2011年的年份完全被忽略了。现在我的问题是:我是否正确地使用了Grouper函数来分析时间序列数据,还是我遗漏了其他任何东西
编辑1:
通过运行:
print(polar_temp.loc['CA002300902'].sort_index(ascending=False))
Value
Date
2011-12-31 -288
2011-12-30 -299
2011-12-29 -347
2011-12-28 -310
2011-12-27 -239
人们可以看到,重新采样之前的台站有2011年之前的数据。我已经创建了合成数据来测试您的方法,效果很好。 然后,我任意删除数据点,以查看聚合是否会因缺少日期而失败,并跳过时间序列中缺少的值,如下面的输出所示。因此,我仍然不明白为什么你们的产量在2005年停止 不进行重采样和插值的输出:
Value
Station_Number Date
CA002100805 2003-01-02 -195.545455
2003-01-10 -144.963636
2003-01-18 -158.045455
2003-01-26 -151.533333
2003-02-03 -196.300000
2003-04-08 -159.963636
2003-04-16 -157.115385
2003-04-24 -150.191489
2003-05-02 -146.113924
2003-05-10 -133.367347
Value
Station_Number Date
CA002100805 2003-01-02 -178.138024
2003-01-10 -135.644524
2003-01-18 -147.253977
2003-01-26 -147.694712
2003-02-03 -200.642180
2003-02-11 -203.057708
2003-02-19 -192.821042
2003-02-27 -182.584375
2003-03-07 -172.347708
2003-03-15 -162.111042
2003-03-23 -151.874375
2003-03-31 -141.637708
2003-04-08 -154.028469
2003-04-16 -151.099405
2003-04-24 -156.152083
请注意,它是如何在2003年3月完全跳过数据点的
您可以通过以下方式对问题进行排序:
1.
2.向NAs中填充
现在请注意,由于采用了插值策略,它包含的2003年3月的数据点介于2003年2月和4月的值之间。某些台站在2005年之后没有数据吗?我相信聚合将只包括站点有数据的时段。但聚合仍应在具有2003年至2011年数据的站点上运行,因为据我所知,pandas会按站点运行重采样。您是否可以通过运行
df.loc[station_WITH_LATER_data']来再次检查这一点。排序索引(ascending=False)
。此外,我不认为这会有什么不同,但是polar_temp.groupby(['Station Number',pd.Grouper(level='Date',freq='8D')]))
对于分组操作来说已经足够了。感谢您让我再次检查,因为对于某些站点,重采样在整个时间段内都有效,但是行数下降到了60.000左右,而它应该在300.000左右。我再次检查了,甚至数年来都存在数据缺口,这是不正确的。这是一个版本很好的方法,但不幸的是,我不被允许插值数据。我也考虑过添加缺失的日期,但无法想出一个更好的方法。您可以跳过插值,最终的数据集将显示没有数据的NAs。让我知道它是否有效。如果有效,如果您接受答案并请向上投票。我会的,谢谢你的帮助!我正在努力将丢失的日期添加到df中。我的方法是创建一个空df,只包含df具有站点数据的时间段的日期,以用NaN填补数据空白。我使用:用于站点,polar_temp.groupby中的gp('station_Number')):station\u merge=pd.merge(gp,df,on=['Date'],how='outer')polar\u m=pd.concat([station\u merge,polar\u merge],axis=0)polar\u m['station\u Number']]=station
为什么不使用我上面发布的重采样方法?data=data.groupby('station\u Number')。重采样('D')。平均值()
我不太确定如何将每个站点的值传递到脚本中。对于所有问题,我深表歉意,因为您可以猜到我是Python新手
Value
Station_Number Date
CA002100805 2003-01-02 -178.138024
2003-01-10 -135.644524
2003-01-18 -147.253977
2003-01-26 -147.694712
2003-02-03 -200.642180
2003-02-11 -203.057708
2003-02-19 -192.821042
2003-02-27 -182.584375
2003-03-07 -172.347708
2003-03-15 -162.111042
2003-03-23 -151.874375
2003-03-31 -141.637708
2003-04-08 -154.028469
2003-04-16 -151.099405
2003-04-24 -156.152083