【问题标题】:How can I generate a pandas date range with a frequency of Tue to Sat inclusive?如何生成频率为周二至周六的熊猫日期范围?
【发布时间】:2020-12-16 16:15:18
【问题描述】:

我正在尝试使用具有自定义每日频率的 pandas 生成日期时间索引。

目前,我可以生成以下日期时间索引:

import pandas as pd
import datetime as dt

pd.date_range(start=dt.datetime(2020,8,28),end=dt.datetime(2020,9,30),freq='B')

DatetimeIndex(['2020-08-28', '2020-08-31', '2020-09-01', '2020-09-02',
               '2020-09-03', '2020-09-04', '2020-09-07', '2020-09-08',
               '2020-09-09', '2020-09-10', '2020-09-11', '2020-09-14',
               '2020-09-15', '2020-09-16', '2020-09-17', '2020-09-18',
               '2020-09-21', '2020-09-22', '2020-09-23', '2020-09-24',
               '2020-09-25', '2020-09-28', '2020-09-29', '2020-09-30'],
              dtype='datetime64[ns]', freq='B')

但是,这会返回所有工作日。我想返回所有的周二、周三、周四、周五和周六。也许这可以通过某种自定义设置或某种偏移来完成?具体来说,有没有办法直接使用 date_range 功能和 freq 输入来做到这一点?如果没有,如何最简单的实现?

谢谢!

【问题讨论】:

    标签: python-3.x pandas datetime range datetimeindex


    【解决方案1】:

    dayofweek

    idx = pd.date_range(start=dt.datetime(2020,8,28),end=dt.datetime(2020,9,30))
    s = idx.dayofweek
    idx[s.isin([2,3,4,5])]
    

    DatetimeIndex(['2020-08-28', '2020-08-29', '2020-09-02', '2020-09-03',
               '2020-09-04', '2020-09-05', '2020-09-09', '2020-09-10',
               '2020-09-11', '2020-09-12', '2020-09-16', '2020-09-17',
               '2020-09-18', '2020-09-19', '2020-09-23', '2020-09-24',
               '2020-09-25', '2020-09-26', '2020-09-30'],
              dtype='datetime64[ns]', freq=None)
    

    【讨论】:

    • 这需要包括 1 也是正确的。此 idx[s.isin([2,3,4,5])] 应为 idx[s.isin([1,2,3,4,5])]。
    • 我一开始是这么想的,但是当我用 2,3,4,5,6 运行它时,它似乎包括星期日。
    【解决方案2】:

    您可以使用Timedelta 添加一天,但要不更改您想要的日期范围,您需要在创建边界时删除一天。

    (pd.date_range(start=dt.datetime(2020,8,27),end=dt.datetime(2020,9,29),freq='B') 
      + pd.Timedelta(days=1))
    
    DatetimeIndex(['2020-08-28', '2020-08-29', '2020-09-01', '2020-09-02',
                   '2020-09-03', '2020-09-04', '2020-09-05', '2020-09-08',
                   '2020-09-09', '2020-09-10', '2020-09-11', '2020-09-12',
                   '2020-09-15', '2020-09-16', '2020-09-17', '2020-09-18',
                   '2020-09-19', '2020-09-22', '2020-09-23', '2020-09-24',
                   '2020-09-25', '2020-09-26', '2020-09-29', '2020-09-30'],
                  dtype='datetime64[ns]', freq=None)
    

    编辑:你也可以定义你的CustomBusinessDay

    cbd = pd.tseries.offsets.CustomBusinessDay(weekmask='Tue Wed Thu Fri Sat')
    pd.date_range(start=dt.datetime(2020,8,28),end=dt.datetime(2020,9,30),freq=cbd)
    

    【讨论】:

    • 这失去了第一天,但​​在最后增加了一天。我确实看到这实际上与生成原始索引然后以“B”的频率将其移动 1 相同。我想我试图避免这种情况,然后需要进一步的代码来整理 datetimeindex 的正面和背面。
    • 您提供的编辑是一个更清晰的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2021-12-31
    • 2018-07-24
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多