我想仅使用日期时间模块(而不是时间)从时间戳中提取月份和日期,然后确定它是否属于给定季节(秋季,夏季,冬季,春天)的基础上固定的日期和分点。使用日期时间确定在Python中使用时间戳的季节
例如,如果日期在3月21日到6月20日之间,那就是春季。无论年份如何。我希望它只是看看月和日,而忽略这一计算中的年份。
我一直在遇到麻烦,因为the month is not being extracted properly from my data,for this reason。
我想仅使用日期时间模块(而不是时间)从时间戳中提取月份和日期,然后确定它是否属于给定季节(秋季,夏季,冬季,春天)的基础上固定的日期和分点。使用日期时间确定在Python中使用时间戳的季节
例如,如果日期在3月21日到6月20日之间,那就是春季。无论年份如何。我希望它只是看看月和日,而忽略这一计算中的年份。
我一直在遇到麻烦,因为the month is not being extracted properly from my data,for this reason。
如果日期落在3月21日和6月20日之间,它是春天。 无论年份如何。我希望它只看 的月和日,并忽略计算中的年份。
#!/usr/bin/env python
from datetime import date, datetime
Y = 2000 # dummy leap year to allow input X-02-29 (leap day)
seasons = [('winter', (date(Y, 1, 1), date(Y, 3, 20))),
('spring', (date(Y, 3, 21), date(Y, 6, 20))),
('summer', (date(Y, 6, 21), date(Y, 9, 22))),
('autumn', (date(Y, 9, 23), date(Y, 12, 20))),
('winter', (date(Y, 12, 21), date(Y, 12, 31)))]
def get_season(now):
if isinstance(now, datetime):
now = now.date()
now = now.replace(year=Y)
return next(season for season, (start, end) in seasons
if start <= now <= end)
print(get_season(date.today()))
这是@Manuel G answer的扩展版本,以支持任何一年。
这就是我最终解决的问题。我怀疑这是最好的解决方案,但它的工作原理。随时提供更好的解决方案。
import datetime
def get_season(date):
"""
convert date to month and day as integer (md), e.g. 4/21 = 421, 11/17 = 1117, etc.
"""
m = date.month * 100
d = date.day
md = m + d
if ((md >= 301) and (md <= 531)):
s = 0 # spring
elif ((md > 531) and (md < 901)):
s = 1 # summer
elif ((md >= 901) and (md <= 1130)):
s = 2 # fall
elif ((md > 1130) and (md <= 0229)):
s = 3 # winter
else:
raise IndexError("Invalid date")
return s
season = get_season(dt.date())
您所在的半球必须考虑在内。您必须自己使用地理定位来确定半球。
def season(self, HEMISPHERE):
date = self.now()
md = date.month * 100 + date.day
if ((md > 320) and (md < 621)):
s = 0 #spring
elif ((md > 620) and (md < 923)):
s = 1 #summer
elif ((md > 922) and (md < 1223)):
s = 2 #fall
else:
s = 3 #winter
if not HEMISPHERE == 'north':
s = (s + 2) % 3
return s
我认为半球计算应该使用模数4而不是3?例如,在您的计算中,夏季(1)南半球的结果为0(春季),这是不正确的。 – Ferdy 2015-01-16 10:13:51
只使用年份参数可能会更容易。这与你的方法没有多大区别,但可能比幻数更易于理解。
# get the current day of the year
doy = datetime.today().timetuple().tm_yday
# "day of year" ranges for the northern hemisphere
spring = range(80, 172)
summer = range(172, 264)
fall = range(264, 355)
# winter = everything else
if doy in spring:
season = 'spring'
elif doy in summer:
season = 'summer'
elif doy in fall:
season = 'fall'
else:
season = 'winter'
'tm_yday'在闰年的3月1日后关闭 – jfs 2015-02-24 05:21:02
这就是我通常使用:
seasons = {'Summer':(datetime(2014,6,21), datetime(2014,9,22)),
'Autumn':(datetime(2014,9,23), datetime(2014,12,20)),
'Spring':(datetime(2014,3,21), datetime(2014,6,20))}
def get_season(date):
for season,(season_start, season_end) in seasons.items():
if date>=season_start and date<= season_end:
return season
else:
return 'Winter'
今天(2015年) – jfs 2015-02-24 05:07:24
只是一个改变季节的问题。 – 2015-02-25 22:58:00
我太新,无法评论,我的编辑被拒绝,所以这里是更正的代码@adsf响应。
def season(date, hemisphere):
''' date is a datetime object
hemisphere is either 'north' or 'south', dependent on long/lat.
'''
md = date.month * 100 + date.day
if ((md > 320) and (md < 621)):
s = 0 #spring
elif ((md > 620) and (md < 923)):
s = 1 #summer
elif ((md > 922) and (md < 1223)):
s = 2 #fall
else:
s = 3 #winter
if hemisphere != 'north':
if s < 2:
s += 2
else:
s -= 2
return s
这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 – Lance 2015-11-08 04:43:09
谢谢兰斯。这篇文章改进了以前的答案,我认为这是最好的,因为它考虑到了地理因素。 – 2015-11-09 19:18:56
你有什么麻烦? – Blender 2013-04-22 04:11:29
例如,如果日期在3月21日到6月20日之间,那就是春天。无论年份如何。我希望它只是看看月和日,而忽略这一计算中的年份。 – Dan 2013-04-22 04:22:22