Python 计算两个日期之间的夏季天数

Python 计算两个日期之间的夏季天数,python,datetime,Python,Datetime,我想计算两个日期之间的夏季天数。夏天是去年的五月一日到八月 这将计算所有天数: import datetime startdate=datetime.datetime(2015,1,1) enddate=datetime.datetime(2016,6,1) delta=enddate-startdate print delta.days >>517 但是怎样才能只计算过去的夏季天数呢?您可以定义一个生成器来迭代开始日期和结束日期之间的每个日期,定义一个函数来检查日期是否代表

我想计算两个日期之间的夏季天数。夏天是去年的五月一日到八月

这将计算所有天数:

import datetime

startdate=datetime.datetime(2015,1,1)
enddate=datetime.datetime(2016,6,1)

delta=enddate-startdate

print delta.days
>>517

但是怎样才能只计算过去的夏季天数呢?

您可以定义一个生成器来迭代
开始日期
结束日期
之间的每个日期,定义一个函数来检查日期是否代表夏季天数,并使用它来计算夏季天数:

import datetime

startdate = datetime.datetime(2015,1,1)
enddate = datetime.datetime(2016,6,1)

all_dates = (startdate + datetime.timedelta(days=x) for x in range(0, (enddate-startdate).days))

def is_summer_day(date):
    return 5 <= date.month <= 8

print(sum(1 for date in all_dates if is_summer_day(date)))
# 154
导入日期时间
startdate=datetime.datetime(2015,1,1)
enddate=日期时间.datetime(2016,6,1)
所有_日期=(范围(0,(enddate startdate).days)内x的startdate+datetime.timedelta(天=x)
def是夏季(日期):

返回5您可以定义一个生成器来迭代
startdate
enddate
之间的每个日期,定义一个函数来检查日期是否代表夏季,并使用它来计算夏季天数:

import datetime

startdate = datetime.datetime(2015,1,1)
enddate = datetime.datetime(2016,6,1)

all_dates = (startdate + datetime.timedelta(days=x) for x in range(0, (enddate-startdate).days))

def is_summer_day(date):
    return 5 <= date.month <= 8

print(sum(1 for date in all_dates if is_summer_day(date)))
# 154
导入日期时间
startdate=datetime.datetime(2015,1,1)
enddate=datetime.datetime(2016,6,1)
所有_日期=(范围(0,(enddate startdate).days)内x的startdate+datetime.timedelta(天=x)
def是夏季(日期):

return 5您可以创建一些函数来计算两天之间的夏季天数:

from datetime import date

def get_summer_start(year):
    return date(year, 5, 1)

def get_summer_end(year):
    return date(year, 8, 31)

def get_start_date(date, year):
    return max(date, get_summer_start(year))

def get_end_date(date, year):
    return min(date, get_summer_end(year))

def count_summer_days(date1, date2):
    date1_year = date1.year
    date2_year = date2.year

    if date1_year == date2_year:
        s = get_start_date(date1, date1_year)
        e = get_end_date(date2, date1_year)
        return (e - s).days

    else:
        s1 = max(date1, get_summer_start(date1_year))
        e1 = get_summer_end(date1_year)

        first_year = max(0,(e1 -s1).days)

        s1 = get_summer_start(date2_year)
        e1 = min(date2, get_summer_end(date2_year))

        last_year = max(0,(e2 -s2).days)

        other_years = date2_year - date1_year - 1
        summer_days_per_year = (get_summer_end(date1_year) - get_summer_start(date1_year)).days

        return first_year + last_year + (other_years * summer_days_per_year)

date1 = date(2015,1,1)
date2 = date(2016,6,1)

print count_summer_days(date1, date2)

您可以创建一些函数来计算两天之间的夏季天数:

from datetime import date

def get_summer_start(year):
    return date(year, 5, 1)

def get_summer_end(year):
    return date(year, 8, 31)

def get_start_date(date, year):
    return max(date, get_summer_start(year))

def get_end_date(date, year):
    return min(date, get_summer_end(year))

def count_summer_days(date1, date2):
    date1_year = date1.year
    date2_year = date2.year

    if date1_year == date2_year:
        s = get_start_date(date1, date1_year)
        e = get_end_date(date2, date1_year)
        return (e - s).days

    else:
        s1 = max(date1, get_summer_start(date1_year))
        e1 = get_summer_end(date1_year)

        first_year = max(0,(e1 -s1).days)

        s1 = get_summer_start(date2_year)
        e1 = min(date2, get_summer_end(date2_year))

        last_year = max(0,(e2 -s2).days)

        other_years = date2_year - date1_year - 1
        summer_days_per_year = (get_summer_end(date1_year) - get_summer_start(date1_year)).days

        return first_year + last_year + (other_years * summer_days_per_year)

date1 = date(2015,1,1)
date2 = date(2016,6,1)

print count_summer_days(date1, date2)

以下是一个更好的解决方案,适用于长时间:

first_summer_day = (5,1)
last_summer_day = (8,31)

from datetime import date

startdate = date(2015,1,1)
enddate = date(2016,6,1)

# make sure that startdate > endate
if startdate > enddate:
    startdate, endate = endate, startdate


def iter_yearly_summer_days(startdate, enddate):
    for year in range(startdate.year, enddate.year+1):
        start_period = startdate if year == startdate.year else date(year, 1, 1)
        end_period = enddate if year == enddate.year else date(year, 12, 31)

        year_first_summer_day = date(year, *first_summer_day)
        year_last_summer_day = date(year, *last_summer_day)

        summer_days_that_year = (min(year_last_summer_day, end_period) - max(year_first_summer_day, start_period)).days
        print('year {} had {} days of summer'.format(year, summer_days_that_year))
        yield summer_days_that_year


print(sum(iter_yearly_summer_days(startdate, enddate)))

以下是一个更好的解决方案,适用于长时间:

first_summer_day = (5,1)
last_summer_day = (8,31)

from datetime import date

startdate = date(2015,1,1)
enddate = date(2016,6,1)

# make sure that startdate > endate
if startdate > enddate:
    startdate, endate = endate, startdate


def iter_yearly_summer_days(startdate, enddate):
    for year in range(startdate.year, enddate.year+1):
        start_period = startdate if year == startdate.year else date(year, 1, 1)
        end_period = enddate if year == enddate.year else date(year, 12, 31)

        year_first_summer_day = date(year, *first_summer_day)
        year_last_summer_day = date(year, *last_summer_day)

        summer_days_that_year = (min(year_last_summer_day, end_period) - max(year_first_summer_day, start_period)).days
        print('year {} had {} days of summer'.format(year, summer_days_that_year))
        yield summer_days_that_year


print(sum(iter_yearly_summer_days(startdate, enddate)))

看看。这是对夏天的一个非常奇怪的定义…@GreenSaber:不过,这对夏天并没有什么帮助。是吗?你可能应该做更多的尝试。(这也可能会造成问题;您是否有可能处理2015年12月31日至2018年5月7日(包括闰日))的问题)。您也可以尝试将其发布到codegolf;如果这是一个家庭作业,我相信你的老师会喜欢Jelly,或者如果你真的很幸运的话,pyth答案编译的python代码…请看。这是一个非常奇怪的夏天定义…@GreenSaber:不过,这对夏天没什么帮助。是吗?你可能应该做更多的尝试。(这也可能会造成问题;您是否有可能处理2015年12月31日至2018年5月7日(包括闰日))的问题)。您也可以尝试将其发布到codegolf;如果这是一个家庭作业,我相信你的老师会喜欢Jelly,或者如果你真的幸运的话,pyth答案编译成的python代码……当date1和date2不在同一年时,你的函数返回None,这就是问题中的例子。此外,你也不使用
get\u summer\u end
。我正在完成编辑它@EricDuminil您的解决方案肯定是作为脚本实现的最快的。我试图提供一个可能包含在类中并在不同上下文中使用的解决方案。顺便说一句,你的答案值得投一票!此解决方案应具有很强的可扩展性,适用于较大的年份范围!当date1和date2不在同一年时,您的函数返回None,这就是问题示例中的情况。此外,您没有使用
get\u summer\u end
。我正在编辑它@EricDuminil您的解决方案肯定是作为脚本实现的最快的。我试图提供一个可能包含在类中并在不同上下文中使用的解决方案。顺便说一句,你的答案值得投一票!此解决方案应具有很强的可扩展性,适用于较大的年份范围!这是一个聪明的解决办法。由于迭代和求和,我可能在长时间内(相隔多年或数百年)表现不佳,但我认为在“正常”情况下,这并不重要。这是一个聪明的解决方案。由于迭代和求和,我可能在长时间内(相隔多年或数百年)表现欠佳,但我认为在“正常”情况下,这并不重要。