9

datetime モジュール (時間ではない) を使用してタイムスタンプから月と日のみを抽出し、夏至の固定日付に基づいて、特定の季節 (秋、夏、冬、春) 内にあるかどうかを判断したいと思います。分点。

たとえば、日付が 3 月 21 日から 6 月 20 日の間にある場合、それは春です。年式問わず。この計算では、月と日だけを見て、年を無視したいのです。

このためデータから月が適切に抽出されないため、これを使用すると問題が発生します。

4

9 に答える 9

16

day of year パラメーターを使用する方が簡単かもしれません。それはあなたのアプローチと大差ありませんが、マジック ナンバーより理解しやすいかもしれません。

# 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'
于 2014-07-05T03:08:12.793 に答える
2

私はコメントするには新しすぎて、編集が拒否されたので、@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
于 2015-11-07T05:20:32.450 に答える
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())
于 2013-04-22T05:18:51.537 に答える