前天上班

2024-06-01 02:46:18 发布

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

基本上,我正在寻找某种方法来计算前天的业务,因为我必须在datetime变量中不受任何手动干扰的情况下运行t-2查询:

简言之:

27.05.21 -> 25.05.21
今天的日期是一个动态变化的每一天,当然,你应该考虑周末,例如31.05.21-gt;27.05.21

我在“获取最后一个工作日方法”上下了功夫来修改它

today = datetime.today()
offset = max(1, (today. weekday() + 6) % 7 - 3)
timedelta = datetime. timedelta(offset)
most_recent = today - timedelta
print(most_recent)

……但我失败得很惨,不值得在这里提及

任何帮助都将不胜感激

非常感谢

再见 R


Tags: 方法gtmosttodaydatetime情况手动业务
2条回答

我认为,我们可以通过预定义目标日需要换班的天数来简化代码。例如,如果目标日期是星期一或星期二,我们将换班4天,否则,我们将星期三换班2天,星期六换班3天

代码:

import datetime

SHIFT_DAY_MAP = {
    0: 4,
    1: 4,
    2: 2,
    3: 2,
    4: 2,
    5: 2,  # Sat.
    6: 3  # Sun.
}


def get_two_business_day_before(date: datetime.datetime):
    weekday = date.weekday()
    shift_days = SHIFT_DAY_MAP[weekday]
    timedelta = datetime.timedelta(days=shift_days)
    return date - timedelta

测试:

for i in range(7):
    d = datetime.datetime(2021, 5, 10 + i)
    print(d.date(), "->", get_two_business_day_before(d).date())

结果:

2021-05-10 -> 2021-05-06
2021-05-11 -> 2021-05-07
2021-05-12 -> 2021-05-10
2021-05-13 -> 2021-05-11
2021-05-14 -> 2021-05-12
2021-05-15 -> 2021-05-13
2021-05-16 -> 2021-05-13

Note: I assume the desirable shift days for weekends are 2 for Sat and 3 for Sun since your requirement does not mention it.

您可以使用^{}(这仅排除周六和周日)

from datetime import datetime
import pandas as pd

dates = ['24.05.21', '25.05.21', '26.05.21']

def offset(date, offset, date_format='%d.%m.%y'):
    return (datetime.strptime(date, date_format) + pd.tseries.offsets.BusinessDay(offset)).strftime(date_format)

for date in dates:
    print('if today =', date, 'the expected result is', offset(date, -2))

输出:

if today = 24.05.21 the expected result is 20.05.21
if today = 25.05.21 the expected result is 21.05.21
if today = 26.05.21 the expected result is 24.05.21

这里有一个没有熊猫的版本:

from datetime import datetime, timedelta

dates = ['24.05.21', '25.05.21', '26.05.21']

def offset(date, offset, date_format='%d.%m.%y'):
    # adds offset
    output = datetime.strptime(date, date_format) + timedelta(days=offset)
    # adds more offset if output's weekday is Saturday or Sunday
    output += timedelta(days=(output.isoweekday() > 5) * offset)
    # returns output
    return output.strftime(date_format)

for date in dates:
    print('if today =', date, 'the expected result is', offset(date, -2))

相关问题 更多 >