Python 在多索引中重新采样会丢失值

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

我有一些从2003年到2011年的分层数据,这些数据从最底层变成了时间序列数据,如下所示:

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