Luiz Stelzer
Luiz Stelzer

Reputation: 79

How to generate even calendar dates?

Does anyone know how to generate a list in Calendar in python (or some other platform) with "even days", month and year from 2018 until 2021?

Example:

Sun, 02 Jan 2019
Tue, 04 Jan 2019
Thur, 06 Jan 2019
Sat, 08 Jan 2019
Sun, 10 Jan 2019
Tue, 12 Jan 2019
Thur, 14 Jan 2019
Sat, 16 Jan 2019
Sun, 18 Jan 2019
Tue, 20 Jan 2019
Thur, 22 Jan 2019

and so on, respecting the calendar until 2021.

EDIT:

how to generate in python a calendar list between 2018 and 2022 with 2 formats:

Day of the week, Date Month Year Time (hours: minutes: seconds) - Year-Month-Date Time (hours: minutes: seconds)

Note: Dates: Peer dates only schedule: Randomly generated schedules

Example:

Tue, 02 Jan 2018 00:59:23  -   2018-01-02  00:59:23
Thu, 04 Jan 2018 10:24:52  -   2018-01-04  10:24:52
Sat, 06 Jan 2018 04:11:09  -   2018-01-06  04:11:09
Mon, 08 Jan 2018 16:12:40  -   2018-01-08  16:12:40
Wed, 10 Jan 2018 10:08:15  -   2018-01-10  10:08:15
Fri, 12 Jan 2018 07:10:09  -   2018-01-12  07:10:09
Sun, 14 Jan 2018 11:50:10  -   2018-01-14  11:50:10
Tue, 16 Jan 2018 02:29:22  -   2018-01-16  02:29:22
Thu, 18 Jan 2018 19:07:20  -   2018-01-18  19:07:20
Sat, 20 Jan 2018 08:50:13  -   2018-01-20  08:50:13
Mon, 22 Jan 2018 02:40:02  -   2018-01-22  02:40:02

and so on, until the year 2022 ...

Upvotes: 0

Views: 505

Answers (2)

martineau
martineau

Reputation: 123491

Here's something fairly simple that seems to work and handles leap years:

from calendar import isleap
from datetime import date

# Days in each month (1-12).
MDAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def dim(year, month):
    """ Number of days in month of the given year. """
    return MDAYS[month] + ((month == 2) and isleap(year))

start_year, end_year = 2018, 2021

for year in range(start_year, end_year+1):
    for month in range(1, 12+1):
        days = dim(year, month)
        for day in range(1, days+1):
            if day % 2 == 0:
                dt = date(year, month, day)
                print(dt.strftime('%a, %d %b %Y'))

Output:

Tue, 02 Jan 2018
Thu, 04 Jan 2018
Sat, 06 Jan 2018
Mon, 08 Jan 2018
Wed, 10 Jan 2018
Fri, 12 Jan 2018
Sun, 14 Jan 2018
Tue, 16 Jan 2018
...

Edit:

Here's a way to do what (I think) you asked how to do in your follow-on question:

from calendar import isleap
from datetime import date, datetime, time
from random import randrange

# Days in each month (1-12).
MDAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def dim(year, month):
    """ Number of days in month of the given year. """
    return MDAYS[month] + ((month == 2) and isleap(year))

def whenever():
    """ Gets the time value. """
    # Currently just returns a randomly selected time of day.
    return time(*map(randrange, (24, 60, 60)))  # hour:minute:second

start_year, end_year = 2018, 2021

for year in range(start_year, end_year+1):
    for month in range(1, 12+1):
        days = dim(year, month)
        for day in range(1, days+1):
            if day % 2 == 0:
                dt, when = date(year, month, day), whenever()
                dttm = datetime.combine(dt, when)
                print(dt.strftime('%a, %d %b %Y'), when, '-', dttm)

Output:

Tue, 02 Jan 2018 00:54:02 - 2018-01-02 00:54:02
Thu, 04 Jan 2018 10:19:51 - 2018-01-04 10:19:51
Sat, 06 Jan 2018 22:48:09 - 2018-01-06 22:48:09
Mon, 08 Jan 2018 06:48:46 - 2018-01-08 06:48:46
Wed, 10 Jan 2018 14:01:54 - 2018-01-10 14:01:54
Fri, 12 Jan 2018 05:42:43 - 2018-01-12 05:42:43
Sun, 14 Jan 2018 21:42:37 - 2018-01-14 21:42:37
Tue, 16 Jan 2018 08:08:39 - 2018-01-16 08:08:39
...

Upvotes: 1

jedwards
jedwards

Reputation: 30230

What about:

import datetime

d = datetime.date.today()                       # Define Start date
while d.year <= 2021:                           # This will go *through* 2012
        if d.day % 2 == 0:                      # Print if even date
                print(d.strftime('%a, %d %b %Y'))
        d += datetime.timedelta(days=1)         # Jump forward a day
Wed, 31 Oct 2018
Fri, 02 Nov 2018
Sun, 04 Nov 2018
Tue, 06 Nov 2018
Thu, 08 Nov 2018
Sat, 10 Nov 2018
Mon, 12 Nov 2018
Wed, 14 Nov 2018
Fri, 16 Nov 2018
Sun, 18 Nov 2018
Tue, 20 Nov 2018
Thu, 22 Nov 2018
...
Fri, 24 Dec 2021
Sun, 26 Dec 2021
Tue, 28 Dec 2021
Thu, 30 Dec 2021

Upvotes: 0

Related Questions