【问题标题】:pandas: create a series of dates that include only certain days of the week skipping weekendspandas:创建一系列日期,仅包括一周中的某些天,跳过周末
【发布时间】:2021-10-25 21:20:36
【问题描述】:

我有一个小脚本(我不是唯一的作者),它创建了一个按日期填写的熊猫系列,没有周末。 在这些日期分发各种任务,并且根据每个任务需要多长时间,其完成可能需要不同的天数。问题是,我怎样才能只考虑某些日子(例如,只考虑星期三和星期四),而不是从星期一到星期五的所有 5 天?

durations = [4, 8, 2, 16, 5]
hours_per_day = 7
start_date = "2021-07-01"

arr = np.array(durations)
bins = [0]
bins.extend([x[-1] for x in np.array_split(np.arange(np.sum(arr)), np.ceil(np.sum(arr)/hours_per_day))])
# [0, 6, 13, 20, 27, 34]
totals = np.cumsum(arr)
# [ 4 12 14 30 35]
idx = np.digitize(totals, bins, right=True)-1
# [0 1 2 4 5]
start_deltas = np.pad(idx, (1, 0))[:-1]
# [0 0 1 2 4] searched deltas

然后我创建数据框:

df = pd.DataFrame({"task":[f"task{x}" for x in range(len(durations))],
                   "duration": durations,
                   "delta":start_deltas})
df["start_date"] = start_date
df["start_date"] = pd.to_datetime(df["start_date"])
df["start_date"] = df.apply(lambda x: x["start_date"] + BDay(pd.to_timedelta(x["delta"], "d").days), axis=1)
df["end_date"] = df.apply(lambda x: x["start_date"] + BDay(pd.to_timedelta(x["duration"]//hours_per_day, "d").days), axis=1)

在最后 2 行中,我想按工作日索引过滤天数。当我尝试应用工作日(及其变体)或 day_name() 时,str 和工作日的连接存在错误。我知道原因,但我对如何实现按天索引进行过滤没有任何想法。

【问题讨论】:

  • 您可能可以使用 CustomBusinessDay 偏移量来指定星期掩码:pd.offsets.CustomBusinessDay(holidays=None, weekmask='Wed Thu Sat Sun') 虽然我不完全确定您需要什么
  • 您的示例所需的输出是什么?
  • @RJAdriaansen 所需的输出是一个数据框,其中包含任务名称、任务持续时间、开始执行这些任务的日期以及完成日期。
  • @ALollz CustomBDay 不适合我的情况,不幸的是。

标签: python pandas numpy


【解决方案1】:

我按照 ALollz 的建议使用了 CustomBusinessDay。它有效。

CDay(pd.to_timedelta(x["delta"], "d").days, weekmask='Wed Thu Sat Sun'), axis=1)

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 2015-02-03
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2011-04-06
    相关资源
    最近更新 更多