Я хочу определить имена всех месяцев между двумя датами, используя datetime - PullRequest
0 голосов
/ 06 марта 2020
import datetime
import calendar

dateStart = datetime.date(2017, 8, 2)
dateEnd = datetime.date(2018, 1, 1)
st = dateStart.month
ed = dateEnd.month
lis = []

for i in range(st, ed + 1):
    lis.append(calendar.month_name[i])

print(lis)

Ожидаемый вывод:

['January', 'August', 'September', 'October', 'November', 'December']

С 'January', относящимся к 2018. Год должен быть отсортирован в соответствии с порядком месяцев. Этот код не работает для этого случая.

Ответы [ 4 ]

1 голос
/ 06 марта 2020

Вот способ сделать это, используя только Python встроенные модули. Обратите внимание, что месяц можно повторить в зависимости от даты начала и окончания.

import datetime
import calendar

dateStart = datetime.date(2017, 8, 2)
dateEnd = datetime.date(2018, 1, 1)

ONE_DAY = datetime.timedelta(days=1)
dt, ed = dateStart, dateEnd
lis = []
last_month = None

while dt <= ed:
    if dt.month != last_month:
        lis.append(dt.month)
        last_month = dt.month
    dt += ONE_DAY

# Sort the month numbers and replace them with their names.
lis = [calendar.month_name[month] for month in sorted(lis)]

print(lis)

Вывод:

['January', 'August', 'September', 'October', 'November', 'December']
1 голос
/ 06 марта 2020

Вы можете использовать relativedelta:

from dateutil.relativedelta import relativedelta
import datetime
import calendar

dateStart = datetime.date(2017,8,2)
dateEnd = datetime.date(2018,1,1)
st = datetime.date(dateStart.year, dateStart.month, 1)
ed = dateEnd

tmp = st
months = {}

while tmp <= dateEnd:
    months[tmp.month] = calendar.month_name[tmp.month]
    tmp += relativedelta(months=1)

lis = [months[k] for k in sorted(list(months.keys()))]
print(lis)

['Январь', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']

0 голосов
/ 06 марта 2020

Использование генератора для итерации по месяцам. Сохраняет даты начала и окончания.

import datetime
import calendar

dateStart = datetime.date(2017, 8, 2)
dateEnd = datetime.date(2018, 1, 1)

def months(start, end):
    ''' Input a start and end date and yields a numerical month
        (between 1 and 12) for each month between the dates.
    '''
    # Include start month:
    if start < end:
        yield start.month
    while start < end: 
        if start.month < 12:  
            start = start.replace(month=start.month+1) 
        else:     
            start = start.replace(year=start.year+1).replace(month=1) 
        yield start.month 

months = [calendar.month_name[month] for month in
            sorted(set(months(dateStart, dateEnd)))] 

print(dateStart) 
print(dateEnd)
print(months)

Вывод:

2017-08-02
2018-01-01
['January', 'August', 'September', 'October', 'November', 'December']

Приведенные выше данные будут печатать не более 12 месяцев, даже если эти две даты разделены более чем на 12 месяцев. Если требуется перечислить повторяющиеся месяцы, чтобы это было немного проще (обратите внимание, что я добавил несколько месяцев к dateEnd для иллюстрации).

import datetime
import calendar

dateStart = datetime.date(2017, 8, 2)
dateEnd = datetime.date(2018, 10, 1)

def months(start, end):
    ''' Input a start and end date and yields a numerical month
        (between 1 and 12) for each month between the dates.
    '''
    if start < end:
        yield calendar.month_name[start.month]
    while start < end:
        if start.month < 12: 
            start = start.replace(month=start.month+1)
        else:
            start = start.replace(year=start.year+1).replace(month=1)
        yield calendar.month_name[start.month]

months = [month for month in months(dateStart, dateEnd)]

print(months)

Вывод:

['August', 'September', 'October', 'November', 'December', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October']
0 голосов
/ 06 марта 2020

проблема в вашем range(), когда вы вводите range(8,1), он вернет 0 шаг, потому что вы не можете увеличить 8 до 1.

, вы можете попробовать следующий код для небольшого улучшения:

if st < ed:
    for i in range(st, ed+1):
        lis.append(calendar.month_name[i])
else:
    for i in range(st, ed+1, -1):
        lis.append(calendar.month_name[i])
print(lis)

но не забывайте, что если вы используете такое же крепление, это не сработает. (2017, 8, 2/2018, 8, 1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...