質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2594閲覧

3月第2日曜日~11月第1日曜日までとそれ以外を判定するコード

TaikiNamioka

総合スコア24

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/04/07 11:01

編集2018/04/07 11:49

pythonで3月第2日曜日~11月第1日曜日までとそれ以外を判定する方法ってありますでしょうか?
日付はdatetimeを使用しています。

ちなみに、3月第2日曜日~11月第1日曜日までを夏
上記の日付は以上以下の判定になります。

それ以外を冬で判定したいです。

問題としては例えば3月の第1週目の月曜日は、第1週目の日曜日よりも後か先かの判定が思いついていないです。

途中までコードを書いたのですが、もしもっといい方法があればご教示頂きたいです。

def closePrice(DATE): jstTime = time = datetime.strptime(DATE, '%Y-%m-%d %H:%M:%S') month = jstTime.month day = jstTime.day days = jstTime.day weekDay = jstTime.weekday() weeks = 0 while day > 0: weeks += 1 day -= 7 splitDate = DATE.split(" ") if( 4 <= month <= 10 ): #4月から10月は夏 season = "summer" elif( month == 12 or month == 1 or month == 2 ): #12月から2月までは冬 season = "winter" elif(month == 11): if(weeks >= 2): #11月の2週目以降は冬 season = "winter" else: #11月の1週目の日曜日までは夏 #weeks = 1の場合 if(weekDay == 6): season == "winter" else: if(weekDay == 5): elif(month == 3): if(weeks >= 3): #3月の3週目以降は夏 season = "summer" else: #3月の1週目の日曜日までは冬 #weeks = 1の場合 if(weekDay == 6): season == "winter" else: if(weekDay == 5):

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

python

1import calendar as cal 2import datetime as dt 3 4 5def sundays(month): 6 return [w[cal.SUNDAY] for w in month] 7 8 9def summer_or_winter(date): 10 start_summer = cal.monthcalendar(date.year, 3) 11 end_summer = cal.monthcalendar(date.year, 11) 12 13 start = dt.date(date.year, 3, sundays(start_summer)[1]) 14 end = dt.date(date.year, 11, sundays(end_summer)[0]) 15 16 return ['winter', 'summer'][start <= date <= end] 17 18print(summer_or_winter(dt.date.today())) 19print(summer_or_winter(dt.date(2018, 12, 25)))

モジュールcalendarを用いて、3月第2日曜日及び11月第1日曜日の日付を計算し、dateがその期間に含まれているかを計算しています。

投稿2018/04/07 12:33

編集2018/04/07 12:39
arch_

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaikiNamioka

2018/04/07 12:42

ありがとうございます! カレンダーを使う手法は思いついてなかったです!
hayataka2049

2018/04/07 12:44

標準でありましたか・・・見落としてた
guest

0

ベストアンサー

python

1# coding: UTF-8 2 3import datetime 4 5def check_summer_winter(date_str): 6 date = datetime.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S") 7 year = date.year 8 9 # その年の3月の第二日曜日を決める 10 this_year_summer_start = datetime.datetime(year, 3, 1) 11 sunday_count = 0 12 while True: 13 if this_year_summer_start.weekday() == 6: 14 sunday_count += 1 15 if sunday_count > 1: 16 break 17 this_year_summer_start += datetime.timedelta(days=1) 18 19 # その年の11月の第一日曜日を決める 20 this_year_summer_end = datetime.datetime(year, 11, 1) 21 sunday_count = 0 22 while True: 23 if this_year_summer_end.weekday() == 6: 24 sunday_count += 1 25 if sunday_count > 0: 26 break 27 this_year_summer_end += datetime.timedelta(days=1) 28 29 # 判定して返す 30 if this_year_summer_start <= date <= this_year_summer_end: 31 return "summer" 32 else: 33 return "winter" 34 35def test(): 36 lst = [] 37 base_date = datetime.datetime(2018, 1, 1) 38 for i in range(365): 39 lst.append(base_date + datetime.timedelta(days=i)) 40 41 for x in lst: 42 print(x, "月火水木金土日"[x.weekday()]) 43 print(check_summer_winter(x.strftime("%Y-%m-%d %H:%M:%S"))) 44 45def main(): 46 test() 47 48if __name__ == "__main__": 49 main()

ロケール絡みでトラブるかもしれないので、よく確認してください。
何回も呼ぶのであれば、3月第2日曜日と11月第1日曜日の計算はキャッシュされるような仕組みを作った方が良いかもしれません。
以上未満がよくわからなかったのと、冬と夏は逆な気がしたので、とりあえずソースの通りの判定にしてあります。

追記

区間は以上・以下(第二・第一日曜日含む)とのことなのでそれに合わせて判定処理を修正しました。

投稿2018/04/07 11:42

編集2018/04/07 11:56
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaikiNamioka

2018/04/07 11:52

ご回答ありがとうございます! ご指摘いただいた夏冬の逆転と、日付の以上未満も修正いたしました!
TaikiNamioka

2018/04/07 11:57

修正もありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問