Python handles duplicate schedules

Asked 2 years ago, Updated 2 years ago, 19 views

You are creating a script that writes to text by treating the calendar list as a repeat statement.

I'm implementing the ability to bundle and display duplicate schedules, but it doesn't work as I want.

The final output value (body in the code) should come out like this:

 2019-01-01 (Tue):
New Year's Day
2019-01-05 (Sunday)~2019-02-03 (Sun):
winter vacation
2019-02-04 (Monday):
winter vacation
Lunar New Year holiday
2019-02-05 (Tuesday):
winter vacation
the Lunar New year
2019-02-06 (Wednesday):
winter vacation
Lunar New Year holiday
2019-02-07 (Friday)~2019-02-28 (Thursday):
winter vacation

But when you run the code, it looks like this:

 2019-01-01 (Tue):
New Year's Day
2019-01-05 (Sat):
winter vacation
2019-01-06 (Sunday)~2019-02-03 (Sun):
winter vacation
2019-02-04 (Monday):
winter vacation
Lunar New Year holiday
2019-02-05 (Tuesday):
winter vacation
the Lunar New year
2019-02-06 (Wednesday):
winter vacation
Lunar New Year holiday
2019-02-07 (Thursday):
winter vacation
2019-02-08 (Friday)~2019-02-28 (Thursday):
winter vacation

Although the schedule overlaps from January 5th to February 3rd, January 5th is separately listed.

prev_schdl = None
schdl_start_date = None
schdl_end_date = None

for i in schdls:
    date = datetime.date(int(i[0]), int(i[1]), int(i[2])) #year, month, day
    prsnt_schdl = pstpr(i[3]) #Schedule

    if prsnt_schdl:
        if not schdl_start_date:
            schdl_start_date = date
            schdl_end_date = date

        If prsnt_schdl == prev_schdl: # Update the end date if it is the same as the previous schedule
            schdl_end_date = date
        elif schdl_start_date:
            If not schdl_start_date == schdl_end_date: # If not a one-day schedule
                body = "%s%s(%s)~%s(%s):\n%s\n" % (
                    body, schdl_start_date, wday(schdl_start_date), schdl_end_date,
                    wday(schdl_end_date), prev_schdl)  # YYYY-MM-DD(Weekday)
            body = "%s%s(%s):\n%s\n" % (body, date, wday(date), prsnt_schdl)  # YYYY-MM-DD(Weekday)
            # Initialize variables
            schdl_start_date = None
            schdl_end_date = None

        prev_schdl = prsnt_schdl #Save the previous schedule

If prev_schdl: # Record even if it's the last schedule of the month
    body = "%s%s(%s)~%s(%s):\n%s\n" % (body, schdl_start_date, wday(schdl_start_date), schdl_end_date,
                                       wday(schdl_end_date), prev_schdl)  # YYYY-MM-DD(Weekday)

In the above code, schdls is a list, and

 [(2019, 1, 1, 'New Year'), (2019, 1, 2, 'No Schedule'), (2019, 1, 3, 'No Schedule'), (2019, 1, 4, 'No Schedule'), (2019, 1, 6, 'Winter 1, 9, 'Non-Saturday Holiday'), (2019, 'Winter 1, 9, 'Vacation', 'Vacation', (2019, 'Vacation', 'Vacation', '19, 1, 2, 2019', '19, winter 1, 2, '19, 2019', '19, 2019', '19, 1, 2, 'No Schedule'9, 1, 14, 'Winter Vacation'), (2019, 1, 15, 'Winter Vacation'), (2019, 1, 16, 'Winter Vacation'), (2019, 1, 17, 'Winter Vacation'), (2019, 1, 18, 'Winter Vacation'), (2019, 1, 19, 'Saturday Holiday'), (2019, 1, 20, 'Winter Vacation' (2019, 'Winter Vacation', 'Winter Vacation', 'Winter Vacation', 'Winter Vacation', (2019, 1, 19, 21, 22, 2019', 'Winter Vacation'Hak'), (2019, 1, 29, 'Winter Vacation'), (2019, 1, 30, 'Winter Vacation'), (2019, 1, 31, 'Winter Vacation'), (2019, 2, 1, 'Winter Vacation'), (2019, 2, 2, 3, 'Winter Vacation'), (2019, 2, 4, 'Winter Vacation' (Winter Vacation 2, 2019), 'Winter Vacation 2, 'Winter Vacation', (Winter 2, 2019), 'Winter Vacation 2, 2019', 'Winter Vacation 2, 2019', 'Winter Vacation 2, 2019', 'N', 'Winter vacation', 'Winter vacation 2, 2019', 'Winter vacation 2, 2019', 'Winter vacation 2, 2019', 'Winter vacation', '9, 2, 12, 'Winter Vacation'), (2019, 2, 13, 'Winter Vacation' (2019, 2, 14, 'Winter Vacation'), (2019, 2, 15, 'Winter Vacation' (2019, 2, 16, 'NSaturday Holiday'), (2019, 2, 17, 'Winter Vacation' (2019, 2, 18, 'Winter Vacation'), 'Winter 2, 18, 'Winter Vacation' (2019, 2, 'Winter Vacation' (2019, 2, 14, 'Winter Vacation'), '20', 'Winter Vacation', '2', 'Winter vacation', 'Winter vacation', '2', 'Winter vacation', 'Winter vacation', '2', '20', 'Winter vacation',(2019, 2, 27, Winter Vacation), (2019, 2, 28, Winter Vacation)]

This is how the value is included.

pstpr is a function that removes unnecessary information such as Saturday holidays.

What should I do?

Modify: Attach a code that is practically executable.

import datetime
prev_schdl = None
schdl_start_date = None
schdl_end_date = None
schdls = [(2019, 1, 1, 'New Year'), (2019, 1, 2, 'No schedule'), (2019, 1, 3, 'No schedule', (2019, 1, 4, 'No schedule'), (2019, 1, 5, 'Winter Vacation'), (2019, 1, 6, 'Winter Vacation'), (2019, 1, 7, 'Winter Vacation' (2019), 'Winter 1, 19, '19, 'Vacation', (Winter vacation', '19, winter 1, 2019, '19, vacation', '19, vacation', '19, 12, 2019', '19, vacation') 'Winter Vacation'), (2019, 1, 16, 'Winter Vacation'), (2019, 1, 17, 'Winter Vacation'), (2019, 1, 18, 'Winter Vacation'), (2019, 1, 20, 'Winter Vacation'), (2019, 1, 21, 'Winter Vacation'), (2019, 1, 22, 'Winter Vacation'), (2019, 'Winter Vacation' (27), 'Winter Vacation' (2019, 1, 19, 26, 'Winter Vacation' (27), 'Winter Vacation' (27), 'Winter Vacation', 'Winter Vacation' (2019, 2019', 'Winter Vacation', 'Winter Vacation', '24, 2019', 'Winter Vacation', 'Winter Vacation', ''), (2019, 1, 31, 'Winter Vacation'), (2019, 2, 1, 'Winter Vacation'), (2019, 2, 2, 'Winter Vacation'), (2019, 2, 3, 'Winter Vacation'), (2019, 2, 4, 'Winter Vacation\nNew Year'), (2019, 2, 6, 'Winter Vacation\nNew Year' (Winter Vacation', 'Winter Vacation', 'Winter 2, 2019', 'Winter Vacation', 'Winter 2, 2019', '19', 'Winter Vacation', 'Winter Vacation', '1, 2,', '1, 2,', 'Winter Vacation', '19, 2, 2019', 'Winter Vacation', '19, 2, 2019', 'Winter'), (2019, 2, 15, 'Winter Vacation'), (2019, 2, 16, 'Winter Vacation'), (2019, 2, 17, 'Winter Vacation'), (2019, 2, 18, 'Winter Vacation'), (2019, 2, 19, 'Winter Vacation'), (2019, 2, 21, 'Winter Vacation' (2019, 2, 21, 'Winter Vacation'), 'Winter 2, 16, '20', 'Winter Vacation' (2019, 2, 19, '29, '2', '2', '2', '2', '2', '20', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '
body = str()

for i in schdls:
    date = datetime.date(int(i[0]), int(i[1]), int(i[2])) #year, month, day
    prsnt_schdl = i[3] # Schedule

    if prsnt_schdl:
        if not schdl_start_date:
            schdl_start_date = date
            schdl_end_date = date

        If prsnt_schdl == prev_schdl: # Update the end date if it is the same as the previous schedule
            schdl_end_date = date
        elif schdl_start_date:
            If not schdl_start_date == schdl_end_date: # If not a one-day schedule
                body = "%s%s(%s)~%s(%s):\n%s\n" % (
                    body, schdl_start_date, "day", schdl_end_date,
                    "Day", prev_schdl) #YYYY-MM-DD (Weekday)
            body = "%s%s(%s):\n%s\n" % (body, date, "day", prsnt_schdl) #YYYY-MM-DD(Weekday)
            # Initialize variables
            schdl_start_date = None
            schdl_end_date = None

        prev_schdl = prsnt_schdl #Save the previous schedule

If prev_schdl: # Record even if it's the last schedule of the month
    body = "%s%s(%s)~%s(%s):\n%s\n" % (body, schdl_start_date, "day", schdl_end_date,
                                       "Day", prev_schdl) #YYYY-MM-DD (Weekday)

print(body)

python

2022-09-22 18:09

1 Answers

I'm sorry for answering your question.

from itertools import groupby

schdls = [(2019, 1, 1, 'aa'), (2019, 1, 5, 'vacation'), (2019, 1, 6, 'vacation'), (2019, 1, 7, 'vacation'), (2019, 1, 8, 'vacation'), (2019, 1, 9, 'vacation'), (2019, 1, 10, 'vacation'), (2019, 1, 11, 'vacation'), (2019, 1, 12, 'vacation'), (2019, 1, 13, 'vacation'), (2019, 1, 14, 'vacation'), (2019, 1, 15, 'vacation'), (2019, 1, 16, 'vacation'), (2019, 1, 17, 'vacation'), (2019, 1, 18, 'vacation'), (2019, 1, 19, 'vacation'), (2019, 1, 20, 'vacation'), (2019, 1, 21, 'vacation'), (2019, 1, 22, 'vacation'), (2019, 1, 23, 'vacation'), (2019, 1, 24, 'vacation'), (2019, 1, 25, 'vacation'), (2019, 1, 26, 'vacation'), (2019, 1, 27, 'vacation'), (2019, 1, 28, 'vacation'), (2019, 1, 29, 'vacation'), (2019, 1, 30, 'vacation'), (2019, 1, 31, 'vacation'), (2019, 2, 1, 'vacation'), (2019, 2, 2, 'vacation'), (2019, 2, 3, 'vacation'), (2019, 2, 4, 'vacation\nbb'), (2019, 2, 5, 'vacation\naa'), (2019, 2, 6, 'vacation\nbb'), (2019, 2, 7, 'vacation'), (2019, 2, 8, 'vacation'), (2019, 2, 9, 'vacation'), (2019, 2, 10, 'vacation'), (2019, 2, 11, 'vacation'), (2019, 2, 12, 'vacation'), (2019, 2, 13, 'vacation'), (2019, 2, 14, 'vacation'), (2019, 2, 15, 'vacation'), (2019, 2, 16, 'vacation'), (2019, 2, 17, 'vacation'), (2019, 2, 18, 'vacation'), (2019, 2, 19, 'vacation'), (2019, 2, 20, 'vacation'), (2019, 2, 21, 'vacation'), (2019, 2, 22, 'vacation'), (2019, 2, 23, 'vacation'), (2019, 2, 24, 'vacation'), (2019, 2, 25, 'vacation'), (2019, 2, 26, 'vacation'), (2019, 2, 27, 'vacation'), (2019, 2, 28, 'vacation')]

for v, g in groupby(schdls, lambda k: k[3]):
    l = [*g]
    if l[0] != l[-1]:
        print('{}-{:02d}-{:02d} (day) to {}-{:02d}-{:02d} (day): '.format(*l[0][:3], *l[-1][:3]))
    else:
        print('{}-{:02d}-{:02d} (week):'.format(*l[0][:3]))

    print(v)

It was easy to do with itertools.groupby.


2022-09-22 18:09

If you have any answers or tips


© 2024 OneMinuteCode. All rights reserved.