如何将业务日期列表转换为一个或多个期间?

2024-05-16 01:51:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个工作日期列表,如下所示:

list_of_dates = ["15/02/2021", "16/02/2021", "17/02/2021",
                 "19/02/2021", "22/02/2021"," 23/02/2021"]

我想将其转换为连续期间的列表:

list_of_periods = [[start_date="15/02/2021", end_date="17/02/2021"], 
                   [start_date="19/02/2021", end_date="23/02/2021"]

因此,每当两个日期之间有一个或多个营业日时,前一个期间结束,新的期间开始

我考虑过计算日期之间的差异。最好的方法是什么


Tags: of方法列表date差异startlistend
3条回答

假设您的日期为datetime.date,您可以将其减去并创建一个timedelta对象,该对象表示两个日期之间的天数:

from datetime import date

d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
if delta.days >= 1:
  # make time period

https://docs.python.org/library/datetime.html

这不需要计算工作日数

这似乎是您正在寻找的:Find group of consecutive dates in Pandas DataFrame

如果单个日期可以是它们自己的期间(例如示例中的“19/02/2021”),则使用:

import numpy as np
import pandas as pd

list_of_dates = ["15/02/2021","16/02/2021","17/02/2021","19/02/2021","22/02/2021","23/02/2021"]
df = pd.DataFrame({'dates': list_of_dates})
df.dates = pd.to_datetime(df.dates)
day = pd.Timedelta('1d')

breaks = df.dates.diff() != day
groups = breaks.cumsum()
[{'start_date': df.dates[groups==i].iloc[0], 'end_date': df.dates[groups==i].iloc[-1]} 
for i in groups.unique()]

要确定连续工作日的跨度,您需要添加周末(可能还有带有holidays=参数的假日),这样您就可以检查所有日期之间是否有1天的间隔来组成您的组

首先将列表转换为一系列datetime64值,并连接数据中的所有周末。排序并删除重复项。然后找到差异所在!=1以创建组,并希望最小值和最大值获得开始和结束

import pandas as pd
list_of_dates = ["15/02/2021", "16/02/2021", "17/02/2021",
                 "19/02/2021", "22/02/2021", "23/02/2021"]

s = pd.Series(pd.to_datetime(list_of_dates, format='%d/%m/%Y'))
sweekend = pd.Series(pd.bdate_range(s.min(), end=s.max(), freq='C', 
                                    weekmask='Sat Sun', holidays=None))

s = pd.concat([s, sweekend]).drop_duplicates().sort_values()

gps = s.diff().dt.days.ne(1).cumsum()
s.to_frame().groupby(gps).agg(start_date=(0, min), end_date=(0, max))

  start_date   end_date
1 2021-02-15 2021-02-17
2 2021-02-19 2021-02-23

相关问题 更多 >