我需要在每月的第一个星期一运行一个月度报告,并使用Python计算这一天。我目前所拥有的代码将进入ETL程序中的一个模块,并将确定该日期是否实际上是该月的第一天。理想情况下,我需要的是,如果星期一是该月的第一个星期一,则运行该报告(execute = 1)只在这一天运行。否则,不运行任何内容(execute = 0)。我有什么:
# Calculate first Monday of the month
# import module(s)
from datetime import datetime, date, timedelta
today = date.today() # - timedelta(days = 1)
datee = datetime.strptime(str(today), "%Y-%m-%d")
print(f'Today: {today}')
# function finds first Monday of the month given the date passed in "today"
def find_first_monday(year, month, day):
d = datetime(year, int(month), int(day))
offset = 0-d.weekday() #weekday = 0 means monday
if offset < 0:
offset+=7
return d+timedelta(offset)
# converts datetime object to date
first_monday_of_month = find_first_monday(datee.year, datee.month, datee.day).date()
# prints the next Monday given the date that is passed as "today"
print(f'Today\'s date: {today}')
print(f'First Monday of the month date: {first_monday_of_month}')
# if first Monday is true, execute = 1, else execute = 0; 1 will execute the next module of code
if today == first_monday_of_month:
execute = 1
print(execute)
else:
execute = 0
print(execute)
假设“today”中的日期不晚于该月的第一个星期一,则该函数将工作。如果“today”晚于该月的第一个星期一,则将打印下一个星期一。
我们的ETL调度器允许我们每天、每周或每月运行一次。我想我必须每天运行一次,即使这是一个月度报告,并且具有此代码的模块将确定“今天”是否是该月的第一个星期一。如果不是第一个星期一,它将不执行下一个代码模块(execute = 0).如果“today”是一个月的第一个星期一,我不确定它是否会真正运行,因为它会为“today”中传递的任何日期打印下一个星期一。
我似乎找不到我需要的答案,以确保它只计算每月的第一个星期一,并只在当天运行报告。提前感谢。
4条答案
按热度按时间pftdvrlh1#
一种方法是忽略传入的
day
值,而使用7
;那么您只需减去weekday
偏移量:sigwle7e2#
使用numpy,计算每月的第一个星期一要简单得多。
因此只需根据first_monday检查您需要的任何内容,就可以设置了。
ckocjqey3#
另一种稍微不同的方法-
date.weekday()
函数给出了一周中某一天的索引(其中星期一为0,星期日为6)。您可以使用该值直接计算一周中任何一天的日期。对于星期一,如下所示...当然,您可以创建一个通用版本,它允许您指定您在一周中哪一天之后,如下所示:
它接受的索引与
date.weekday()
函数返回的索引相同(Monday为0,Sunday为6)。例如,要查找2022年7月的第一个星期三(2
)...6yjfywim4#
下面是一个函数,它将查找给定月份中第一次出现的某一天。