【问题标题】:How does one subset pandas dataframe dates on monthly endpoints?一个子集 pandas 数据框如何在每月端点上约会?
【发布时间】:2019-11-13 23:43:52
【问题描述】:

我确信这是一个非常简单的问题,因此感谢您的帮助和耐心,因为我对 python 编程还很陌生。我有一个简单的时间序列数据框,其中包含每日日期索引和值列。我想在每月端点上对这个数据框进行子集化,例如1 月 31 日、2 月 28 日、3 月 31 日等。但是,我不知道该怎么做。

我熟悉 R 中带有 xts 包的等效函数:

mends_xts <- my_xts[endpoints(my_xts, on = 'months')]

但是,我对 python 函数不熟悉,我很难在网上找到等效的函数。

这是我的熊猫时间序列数据框示例:

idx = pd.date_range('2018-01-01', periods=100, freq='D')
ts = pd.Series(range(len(idx)), index=idx)
ts_sub = ts[....] # I am really unsure what to put in this part to subset the dates

我希望输出看起来像:

2018-01-31 30

2018-02-28 58

2018-03-31 89

再次感谢您提前提供帮助:)

【问题讨论】:

    标签: python pandas date time-series endpoint


    【解决方案1】:

    可以通过M频率字符串获取月末:

    idx1 = pd.date_range('2018-01-01', periods=3, freq='M')
    ts_sub = ts[ts=idx1]
    

    输出:

    2018-01-31    30
    2018-02-28    58
    2018-03-31    89
    

    【讨论】:

    • 谢谢,但这假设 idx1 中的日期在原始 ts 中,诚然,这就是我提出问题的方式。但是,假设时间序列中有一个月在 30 号结束,但该月的时间序列中的数据只上升到 28 号,那么此方法将不会返回特定时间序列在该月的最后日期.您知道如何从时间序列本身获取月份端点吗?
    • IIUC 您正在寻找 Serge Ballesta 在他的回答第二部分中写的内容:idx1 = pd.date_range(ts.index.min(), ts.index.max(), freq='M')
    【解决方案2】:

    你可以使用resample:

    ts_sub = ts.resample('M')
    

    但即使是不完整的月份,你也会得到一个价值

    2018-01-31    30
    2018-02-28    58
    2018-03-31    89
    2018-04-30    99
    Freq: M, dtype: int64
    

    如果你不想这样,你可以提取相关索引:

    ts_sub = ts.loc[pd.date_range(ts.index.min(), ts.index.max(), freq='M')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-27
      • 2014-09-17
      • 1970-01-01
      • 2017-08-23
      • 2018-01-10
      • 2018-07-08
      • 2021-03-30
      • 2020-10-18
      相关资源
      最近更新 更多