2013-04-22 29 views
3

我想仅使用日期时间模块(而不是时间)从时间戳中提取月份和日期,然后确定它是否属于给定季节(秋季,夏季,冬季,春天)的基础上固定的日期和分点。使用日期时间确定在Python中使用时间戳的季节

例如,如果日期在3月21日到6月20日之间,那就是春季。无论年份如何。我希望它只是看看月和日,而忽略这一计算中的年份。

我一直在遇到麻烦,因为the month is not being extracted properly from my datafor this reason

+2

你有什么麻烦? – Blender 2013-04-22 04:11:29

+0

例如,如果日期在3月21日到6月20日之间,那就是春天。无论年份如何。我希望它只是看看月和日,而忽略这一计算中的年份。 – Dan 2013-04-22 04:22:22

回答

6

如果日期落在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的扩展版本,以支持任何一年。

1

这就是我最终解决的问题。我怀疑这是最好的解决方案,但它的工作原理。随时提供更好的解决方案。

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

您所在的半球必须考虑在内。您必须自己使用地理定位来确定半球。

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 
+1

我认为半球计算应该使用模数4而不是3?例如,在您的计算中,夏季(1)南半球的结果为0(春季),这是不正确的。 – Ferdy 2015-01-16 10:13:51

7

只使用年份参数可能会更容易。这与你的方法没有多大区别,但可能比幻数更易于理解。

# 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' 
+2

'tm_yday'在闰年的3月1日后关闭 – jfs 2015-02-24 05:21:02

0

这就是我通常使用:

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' 
+1

今天(2015年) – jfs 2015-02-24 05:07:24

+0

只是一个改变季节的问题。 – 2015-02-25 22:58:00

0

我太新,无法评论,我的编辑被拒绝,所以这里是更正的代码@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 
+1

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 – Lance 2015-11-08 04:43:09

+0

谢谢兰斯。这篇文章改进了以前的答案,我认为这是最好的,因为它考虑到了地理因素。 – 2015-11-09 19:18:56

相关问题