簡體   English   中英

計算兩個日期之間的夏季天數

[英]Count summer days between two dates

我想計算兩個日期之間的夏季天。 夏天是五月一日至八月底。

這將算一整天:

import datetime

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

delta=enddate-startdate

print delta.days
>>517

但是,如何只計算過去的夏日呢?

您可以定義一個生成器以遍歷startdateenddate之間的每個日期,定義一個函數來檢查日期是否代表夏日,並使用sum來計算夏日:

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

多虧了生成器,您無需在startdateenddate之間的每一天都在內存中創建龐大的列表。

即使不需要,此迭代仍會考慮每一天。 對於很大的差距,您可以使用以下事實:根據您的定義,每個整年都有123個夏日。

您可以創建一些函數來計算兩天之間的夏季天數:

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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM