为了账号安全,请及时绑定邮箱和手机立即绑定

Python - 遍历月份日期并打印自定义输出

Python - 遍历月份日期并打印自定义输出

明月笑刀无情 2022-12-20 16:43:36
我目前不确定用于以下问题的逻辑以及编程的新手。(目前正在学习 python)尝试遍历给定月份的每个日期 - 比如 05/01 - 05/31 并以下面的格式打印出来。周一到周五的日期要单独打印。星期六和星期日的日期要单独打印。如果这个月从星期五开始 - 05/01/2020,输出应该是 那个星期的最后一个工作日。对于 2020 年 4 月,产量将如下所示,因为 4 月的第一周从周三开始。我设法想出以下尝试,但不确定如何进一步进行。import sysfrom datetime import date, datetime, timedeltayear = 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 += deltafor 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提出了一个独立的“if 循环”,正如我之前所说,不确定如何构建更大的图景:(if get_first_day == 1:        #print("Monday")        sec_d =  first_date + timedelta(days=4)elif get_first_day == 2:        sec_d = first_date + timedelta(days=3)elif get_first_day == 3:        sec_d = first_date + timedelta(days=2)elif get_first_day == 4:        sec_d = first_date + timedelta(days=2)elif get_first_day == 5:        sec_d = first_date        #print("Friday")else:        passprint(f"Second date:{sec_d} ") -- which gave  -- > Second date:2020-05-01
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

您可以将日期保存在字典中,字典键是日历周和日期类型(周末、星期几)的元组。


每一天都保存在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))

输出:


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


查看完整回答
反对 回复 2022-12-20
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信