首页 文章

熊猫时间序列重新取样,binning似乎关闭了

提问于
浏览
3

我在这里回答了另一个问题,关于我想知道的大熊猫,时间序列重新采样,当我注意到这个奇怪的分档时 .

假设我有一个带有每日日期范围索引的数据框和一个我要重新取样和总和的列 .

index = pd.date_range(start="1/1/2018", end="31/12/2018") 
df = pd.DataFrame(np.random.randint(100, size=len(index)), 
                  columns=["sales"], index=index)

>>> df.head()
            sales
2018-01-01     66
2018-01-02     18
2018-01-03     45
2018-01-04     92
2018-01-05     76

现在我重新采样一个月,一切看起来都很好:

>>>df.resample("1M").sum()

            sales
2018-01-31   1507
2018-02-28   1186
2018-03-31   1382
[...]
2018-11-30   1342
2018-12-31   1337

如果我尝试重新采样数月,虽然binning开始关闭 . 6M 特别明显

df.resample("6M").sum()                                                           
            sales
2018-01-31   1507
2018-07-31   8393
2019-01-31   7283

第一个箱子跨越一个月,最后一个箱子走向未来一个月 . 也许我必须设置 closed="left" 以获得适当的限制:

df.resample("6M", closed="left").sum()                                            
            sales
2018-06-30   8090
2018-12-31   9054
2019-06-30     39

现在我在2019年有一个额外的箱子,数据来自2018-12-31 ......

这工作正常吗?我错过了我应该设置的任何选项吗?

EDIT: 这里的输出我期望以六个月的间隔重新采样一年,第一个间隔从1月1日到6月30日,第二个间隔从7月1日到12月31日 .

df.resample("6M", closed="left").sum()                                            
            sales
2018-06-30   8090
2018-12-31   9093 # 9054 + 39

请注意,这里也有一些疑问,关于6月30日数据发生了什么,它是否像我期望的那样进入第一个bin或第二个?我的意思是最后一个箱子很明显,但同样的情况可能发生在所有的箱子里 .

2 回答

  • 1

    添加 np.random.seed(365) 以检查我们的输出 .

    print(df.resample("6M", kind='period').sum())
    
             sales
    2018-01   8794
    2018-07   9033
    

    这会对你有用吗?

  • 1

    M 时间偏移别名意味着month end frequency . 你需要的是 6MS 这是月开始频率的别名:

    df.resample('6MS').sum()
    

    导致

    sales
    2018-01-01   8130
    2018-07-01   9563
    2019-01-01      0
    

    df.groupby(pd.Grouper(freq='6MS')).sum() 也可以互换使用 .


    为了更加清晰,您可以直接比较范围:

    >>> pd.date_range('2018-01-01', '2018-12-31', freq='6M')
    DatetimeIndex(['2018-01-31', '2018-07-31'], dtype='datetime64[ns]', freq='6M')
    
    >>> pd.date_range('2018-01-01', '2018-12-31', freq='6MS')
    DatetimeIndex(['2018-01-01', '2018-07-01'], dtype='datetime64[ns]', freq='6MS')
    

相关问题