【问题标题】:Resample with custom month-end frequency使用自定义月末频率重新采样
【发布时间】:2016-10-19 02:25:01
【问题描述】:

我正在寻找与 W-MON(每周,周一结束)等效的月度数据规范。

具体来说,我有一个包含每日数据的 pandas 数据框,我只想每月观察一次,从最近的日期开始,每月返回一次。

所以如果今天是 17/06/2016,我的日期索引将是 17/06/2016、17/05/2016、17/04/2016... 等等。

现在我只能找到 month-start 和 month-end 作为 df.asfreq() 的规范。

谢谢。

【问题讨论】:

  • 如何将它们锚定到月初,然后添加适当日期的时间增量? (不太确定这是否适用于没有所需天数的月份......)
  • 今天是 1 月 31 日,您想要的输出是什么?显然你不能有 2 月 31 日

标签: python pandas dataframe time-series frequency


【解决方案1】:

您可以使用relativedelta 创建相关日期并使用.loc[] 选择:

from datetime import datetime
from dateutil.relativedelta import relativedelta
from pandas_datareader.data import DataReader

使用每日样本数据:

stock_data = DataReader('FB', 'yahoo', datetime(2013, 1, 1), datetime.today()).resample('D').fillna(method='ffill')['Open']

以及显示 relativedelta 如何处理这种情况的月底日期:

today = date(2016, 1, 31) 

创建日期序列:

n_months = 30
dates = [today - relativedelta(years=m // 12, months=m % 12) for m in range(n_months)]

得到:

stock_data.loc[dates]

Date
2016-01-31    108.989998
2015-12-31    106.000000
2015-11-30    105.839996
2015-10-31    104.510002
2015-09-30     88.440002
2015-08-31     90.599998
2015-07-31     94.949997
2015-06-30     86.599998
2015-05-31     79.949997
2015-04-30     80.010002
2015-03-31     82.900002
2015-02-28     80.680000
2015-01-31     78.000000
2014-12-31     79.540001
2014-11-30     77.669998
2014-10-31     74.930000
2014-09-30     79.349998
2014-08-31     74.300003
2014-07-31     74.000000
2014-06-30     67.459999
2014-05-31     63.950001
2014-04-30     57.580002
2014-03-31     60.779999
2014-02-28     69.470001
2014-01-31     60.470001
2013-12-31     54.119999
2013-11-30     46.750000
2013-10-31     47.160000
2013-09-30     50.139999
2013-08-31     42.020000
Name: Open, dtype: float64

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2020-01-13
    • 2019-10-19
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多