Python-迭代月日期并打印自定义输出
我目前不确定用于以下问题的逻辑,也不熟悉编程。(目前正在学习python) 尝试迭代给定月份的每个日期-比如05/01--05/31,并以下面的格式打印出来 周一至周五的日期应单独打印。 周六和周日日期应单独打印 如果该月从2020年1月5日星期五开始,则输出应为 因为,这是那周的最后一个工作日 2020年4月的产量如下所示,因为4月的第一周从周三开始 我设法想出了下面的尝试,但不知道如何进一步进行Python-迭代月日期并打印自定义输出,python,python-3.x,Python,Python 3.x,我目前不确定用于以下问题的逻辑,也不熟悉编程。(目前正在学习python) 尝试迭代给定月份的每个日期-比如05/01--05/31,并以下面的格式打印出来 周一至周五的日期应单独打印。 周六和周日日期应单独打印 如果该月从2020年1月5日星期五开始,则输出应为 因为,这是那周的最后一个工作日 2020年4月的产量如下所示,因为4月的第一周从周三开始 我设法想出了下面的尝试,但不知道如何进一步进行 import sys from datetime import date, datetime
import sys
from datetime import date, datetime, timedelta
year = int(sys.argv[1])
month = int(sys.argv[2])
st_dt = int(sys.argv[3])
en_dt = int(sys.argv[4])
first_date = datetime(year, month, st_dt).date()
get_first_day = datetime(year, month, st_dt).isoweekday()
def daterange(startDate, endDate, delta=timedelta(days=1)):
currentDate = startDate
while currentDate <= endDate:
yield currentDate
currentDate += delta
for date in daterange(date(year, month, st_dt), date(year, month, en_dt), delta=timedelta(days=1)):
print(date)
date.py 2020 5 1 31 # script
您可以将日期保存在字典中,字典键是日历周的元组和日期类型(周末、一周中的某一天) 每天由保存在
allDays
字典中,按周数和日期类型组合作为键进行分组:
('18', 'weekend'): [datetime.date(2020, 5, 2), datetime.date(2020, 5, 3)],
('18', 'working'): [datetime.date(2020, 5, 1)],
('19', 'weekend'): [datetime.date(2020, 5, 9), datetime.date(2020, 5, 10)],
('19', 'working'): [datetime.date(2020, 5, 4), ...
因此,您只需取出每个dict项目的第一项和最后一项:
import sys
from datetime import date, datetime, timedelta
year, month, st_dt, en_dt = 2020, 5, 1, 31
first_date = datetime(year, month, st_dt).date()
get_first_day = datetime(year, month, st_dt).isoweekday()
def daterange(startDate, endDate, delta=timedelta(days=1)):
currentDate = startDate
while currentDate <= endDate:
yield currentDate
currentDate += delta
allDays = {}
_lastDayType = None
for dte in daterange(date(year, month, st_dt), date(year, month, en_dt), delta=timedelta(days=1)):
if 0 <= dte.weekday() < 5:
_dayType = 'working'
else:
_dayType = 'weekend'
_weeknum = dte.strftime("%V") # number of calendar week
_key = (_weeknum, _dayType)
if _key not in allDays: # create an empty list if unique key doesnt exist
allDays[_key] = []
allDays[_key].append(dte) # add the dates ...
for k,v in allDays.items():
if len(v) == 1:
first, last = v[0], v[0]
else:
first, last = v[0], v[-1]
print("%s >> %s" % (first, last))
太快了!:)谢谢我对下面的逻辑有点不知所措。strftime(“%V”)\u key=(\u weeknum,\u dayType)如果{u key不在allDays:allDays[\u key]=[]allDays[\u key]。请您解释一下。我正在尝试添加一个附加功能,以检查给定日期范围内的日期是否为国家假日,请打印“NH”和相应的日期。例如:2020-05-04和2020-05-14是国定假日,仅该日期应打印为
NH 5/4/2020 5/4/2020……NH 5/14/2020 5/14/2020
我尝试过:ph=[]公共假日中的d:ph.append(日期(年、月、整数(d))……所有天中的k、v。items():week_end=''gh=''…..如果v在ph:print(“NH”)中,则其他:first,last=v[0],v[-1]
我是否应该提出一个单独的问题ph数组的输出是[datetime.date(2020,5,4),datetime.date(2020,5,14)]
是的,提出一个新问题。
import sys
from datetime import date, datetime, timedelta
year, month, st_dt, en_dt = 2020, 5, 1, 31
first_date = datetime(year, month, st_dt).date()
get_first_day = datetime(year, month, st_dt).isoweekday()
def daterange(startDate, endDate, delta=timedelta(days=1)):
currentDate = startDate
while currentDate <= endDate:
yield currentDate
currentDate += delta
allDays = {}
_lastDayType = None
for dte in daterange(date(year, month, st_dt), date(year, month, en_dt), delta=timedelta(days=1)):
if 0 <= dte.weekday() < 5:
_dayType = 'working'
else:
_dayType = 'weekend'
_weeknum = dte.strftime("%V") # number of calendar week
_key = (_weeknum, _dayType)
if _key not in allDays: # create an empty list if unique key doesnt exist
allDays[_key] = []
allDays[_key].append(dte) # add the dates ...
for k,v in allDays.items():
if len(v) == 1:
first, last = v[0], v[0]
else:
first, last = v[0], v[-1]
print("%s >> %s" % (first, last))
2020-05-01 >> 2020-05-01
2020-05-02 >> 2020-05-03
2020-05-04 >> 2020-05-08
2020-05-09 >> 2020-05-10
2020-05-11 >> 2020-05-15
2020-05-16 >> 2020-05-17
2020-05-18 >> 2020-05-22
2020-05-23 >> 2020-05-24
2020-05-25 >> 2020-05-29
2020-05-30 >> 2020-05-31