datetime モジュール (時間ではない) を使用してタイムスタンプから月と日のみを抽出し、夏至の固定日付に基づいて、特定の季節 (秋、夏、冬、春) 内にあるかどうかを判断したいと思います。分点。
たとえば、日付が 3 月 21 日から 6 月 20 日の間にある場合、それは春です。年式問わず。この計算では、月と日だけを見て、年を無視したいのです。
このため、データから月が適切に抽出されないため、これを使用すると問題が発生します。
datetime モジュール (時間ではない) を使用してタイムスタンプから月と日のみを抽出し、夏至の固定日付に基づいて、特定の季節 (秋、夏、冬、春) 内にあるかどうかを判断したいと思います。分点。
たとえば、日付が 3 月 21 日から 6 月 20 日の間にある場合、それは春です。年式問わず。この計算では、月と日だけを見て、年を無視したいのです。
このため、データから月が適切に抽出されないため、これを使用すると問題が発生します。
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'
私はコメントするには新しすぎて、編集が拒否されたので、@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
これが私が最終的にそれを解決した方法です。これが最善の解決策であるとは思えませんが、うまくいきます。より良いソリューションを提供してください。
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())