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您的解决方案肯定是作为脚本实现的最快的。我试图提供一个可能包含在类中并在不同上下文中使用的解决方案。顺便说一句,你的答案值得投一票!此解决方案应具有很强的可扩展性,适用于较大的年份范围!这是一个聪明的解决办法。由于迭代和求和,我可能在长时间内(相隔多年或数百年)表现不佳,但我认为在“正常”情况下,这并不重要。这是一个聪明的解决方案。由于迭代和求和,我可能在长时间内(相隔多年或数百年)表现欠佳,但我认为在“正常”情况下,这并不重要。