【问题标题】:Resampling DataFrame accounting for holidays and weekends为假期和周末重新采样 DataFrame
【发布时间】:2020-10-18 21:12:39
【问题描述】:

我刚刚开始玩 Python 和 Pandas,到目前为止总共投入了大约 10 个小时。我有一个每日库存数据的数据框,并且每周对其进行重新采样。问题出在星期五是假期的几周内,我的数据集中得到了 NaN。有没有办法适应这种情况? (当我每月重新采样时也会出现同样的问题,最后一天是周末)。

sample = 'W-FRI'
for i in range(tickerCount):
    datalist.append(yf.download(stock_list[i], start, end))
    datalist[i]['High'] = datalist[i]['High'].resample(sample).max()
    datalist[i]['Low'] = datalist[i]['Low'].resample(sample).min()
    datalist[i]['Open'] = datalist[i]['Open'].resample(sample).first()
    datalist[i]['Close'] = datalist[i]['Close'].resample(sample).last()
    datalist[i] = datalist[i].asfreq(sample, method='pad')

如您所见,耶稣受难日这一周无法正确采样。我知道可以从数据框中删除这些:

    datalist[i] = datalist[i][datalist[i]['High'].notna()]

但理想情况下,我想获取指定重新采样期间的最后一天数据(在这种情况下,使用周四的数据。我查看了 this 答案

有没有办法做到这一点?

编辑:

@ElliottCollins 想到了使用 .ffill() 用之前的数据(从星期四开始)回填星期五。这也会在每周六和周日回填之前的数据。不幸的是,当我这样做然后重新采样 W-FRI 时,我的 Open 值不正确;它们变为上周五的开放,而不是周一的开放

编辑 2

我刚刚意识到,如果我在这一切之后再次设置索引,我可以根据需要重新采样。我将在下面发布解决方案

【问题讨论】:

  • Fwiw,删除这些缺失值的更自然的方法是datalist=datalist.dropna()
  • 您想将数据集中星期五的值设置为与星期四的值相同吗?如果是这样,您可以使用.ffill() 用最新的非缺失值填充缺失值。 IE。 datalist = datalist.ffill().
  • @ElliottCollins 好主意,但不幸的是行不通。这用周五的值回填周日。当我重新采样 W-FRI 时,我的意图是获得 M-F,但我现在获得了 S-F。但由于星期天有星期五的数据,它实际上给了我 F-F ,这使得计算更加混乱。我已经尝试过第一次重新索引,因此我可以删除周末数据,但是我无法重新采样,因为我无法重新采样 Int64Index。不幸回到绘图板
  • 实际上我可以在此之后重置索引,然后根据需要重新采样,所以这确实有效

标签: python-3.x pandas dataframe resampling


【解决方案1】:

感谢@ElliottCollins 关于回填数据的提示。

datalist[i] = datalist[i].ffill()

这也会回填周末,这是我不想要的。所以我需要从索引中创建一列

datalist[i] = datalist[i].reset_index()

然后删除周末

datalist[i] = datalist[i][datalist[i]['Date'].dt.dayofweek < 5]

我需要将 Date 列重置为稍后转换的索引,所以

datalist[i] = datalist[i].set_index('Date')

而且我能够有效地获得我需要的数据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2014-01-15
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多