【问题标题】:Find date ranges that include the weekend using Pandas使用 Pandas 查找包含周末的日期范围
【发布时间】:2018-03-15 08:32:52
【问题描述】:

我在 Python 中有一个 pandas DataFrame,其中两列分别表示开始日期和结束日期。 我想:

  • 假设两个熊猫系列作为开始作为结束日期作为输入...
  • 确定,对于每对开始-结束日期,间隔 [开始,结束)(即包括开始但不包括结束)之间的任何日期是星期五还是星期六...
  • 将 pandas Series 输出为布尔值。
  • 解决方案应该相对较快,因为我正在处理超过 2M 行。

数据集如下所示:

start       end
2013-08-02  2013-08-04
2014-11-24  2014-11-28
2013-10-29  2013-10-31
2013-12-06  2013-12-10
2014-08-15  2014-08-17

我会期待这样的:

has_weekend
TRUE
FALSE
FALSE
TRUE
TRUE

对于具有接近 2M 行的 DataFrame,我目前的方法非常慢。 代码如下:

df.apply(lambda x: np.any(np.in1d([d.weekday() for d in pd.date_range(x.start, x.end)],[4,5])), axis=1)

有什么想法吗?

解决方案 最快的解决方案是来自@Anton VBr 的修改答案

s = df.start.dt.dayofweek
e = df.end.dt.dayofweek
dt = (df.end- df.start).dt.days
has_weekend = ( ((s >= 4) & (s != 6)) | ( e>=5) | ((e < s) & (s != 6)) | (dt >= 6) )

【问题讨论】:

  • 您的问题中缺少数据没有帮助。
  • @cᴏʟᴅsᴘᴇᴇᴅ 为了更清晰,我添加了数据的 sn-p。
  • 对于这个输入,预期是什么? 0, 1, 3, 4?
  • 再检查一下,应该是 T T F T T,你现在的解决方案是一样的。
  • @cᴏʟᴅsᴘᴇᴇᴅ 你是对的,它应该给 T T F T T。我忘了排除结束日期。尽管如此,我的实际解决方案是放慢速度。我会尽快试试你的。

标签: python pandas datetime dataframe intervals


【解决方案1】:

我考虑了一些逻辑运算符,这些应该可以,但是它们对我测试的小集合没有任何时间改进。

s = df.start.dt.dayofweek
e = df.end.dt.dayofweek
(((s >= 4) & (s != 6)) | (( e>=4) & (s != 6)) | (e < s))

【讨论】:

  • 这几乎是我一直在寻找的答案,但它确实加快了速度……虽然我最初的解决方案需要 15 分钟才能运行,但您的修改后的解决方案需要 15 秒。 (没有模组需要 450 毫秒,但没有考虑到日期之间的长时间)。为了以防万一,我已经在编辑中发布了答案。
猜你喜欢
  • 1970-01-01
  • 2012-02-05
  • 2013-06-11
  • 2019-07-04
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多