根据特定格式获取两个日期之间的月份列表

2024-05-13 22:38:20 发布

您现在位置:Python中文网/ 问答频道 /正文

start = "Nov20"
end = "Jan21"

# Expected output:

["Nov20", "Dec20", "Jan21"]

到目前为止,我尝试了以下方法,但我正在寻找更优雅的方法

from calendar import month_abbr
from time import strptime


def get_range(a, b):
    start = strptime(a[:3], '%b').tm_mon
    end = strptime(b[:3], '%b').tm_mon
    dates = []
    for m in month_abbr[start:]:
        dates.append(m+a[-2:])
    for mm in month_abbr[1:end + 1]:
        dates.append(mm+b[-2:])
    print(dates)


get_range('Nov20', 'Jan21')

Note: i don't want to use pandas as that's not logical to import such library for generating dates.


Tags: 方法fromimportforgetrangestartend
2条回答

日期范围可能跨越不同的年份,因此一种方法是从开始日期循环到结束日期,并将月份增加1,直到达到结束日期

试试这个:

from datetime import datetime

def get_range(a, b):
    start = datetime.strptime(a, '%b%y')
    end = datetime.strptime(b, '%b%y')
    dates = []
    while start <= end:
        dates.append(start.strftime('%b%y'))
        if start.month == 12:
            start = start.replace(month=1, year=start.year+1)
        else:
            start = start.replace(month=start.month+1)
    return dates

dates = get_range("Nov20", "Jan21")
print(dates)

输出:

['Nov20', 'Dec20', 'Jan21']

您可以使用timedelta向前推进一个月(31天),但请确保您停留在该月的第一天,否则这些天可能累积起来,最终跳过一个月

from datetime import datetime
from datetime import timedelta

def get_range(a, b):
    start = datetime.strptime(a, '%b%y')
    end = datetime.strptime(b, '%b%y')
    dates = []
    while start <= end:
        dates.append(start.strftime('%b%y'))
        start = (start + timedelta(days=31)).replace(day=1)  # go to 1st of next month
    return dates

dates = get_range("Jan20", "Jan21")
print(dates)

相关问题 更多 >