Help us understand the problem. What is going on with this article?

pythonで世界の主要証券所が夏時間かどうか判断する関数を作ってみた

More than 3 years have passed since last update.

*修正しました

  • 2016.12.12
    4.スクリプト のスクリプト内で def の引数をdate = datetime.datetime.today() としていたものを修正
    このままだと、デフォルトがdefを一度読み込まれた時間のままになってしまう為。

1. 動機

  • 世界の主要証券取引所が今夏時間かどうか手動で切り替えて判断するのはだるい。自動化出来るのでは?
  • タイムゾーンをもう少しちゃんと調べようかと。
  • [Python] タイムゾーンを変換するで殆ど説明されていますが、チェック関数化すれば毎回悩まなくて済むかなと

2. 環境

  • python3.x (恐らく2.7でもokと思う)
  • 必要なパッケージ -pytz

3. チェック方法。

  • pytzのdst(サマータイム?は和製英語のようで、daylight saving timeというみたい)が0かどうかで夏時間かどうかを判定します。
  • 夏時間を判定する日時を現地時間でするのか?日本時間で判定するのか?は悩みどころで、どちらでもチェック出来るようにしています。
  • 夏時間の切り替え時(時間)は微妙なので”5.夏時間チェックの注意点”を参照して下さい。
  • 夏時間をチェック出来るようにしているのは、米国(ニューヨーク)、イギリス (ロンドン)、カナダ(トロント)、ブラジル(サンパウロ)、オーストラリア(シドニー)、ドイツ(フランクフルト *フランクフルト、ヘッセン州がなかったのでベルリン)の証券所ですが、タイムゾーンを追加すればどこでも対応出来ると思います。

4. スクリプト

以下のスクリプトを埋め込めば、チェック出来ます。

  • calcdifftime:指定時刻の指定タイムゾーン(未指定時は日本)との時差 これは必要なければいりません。
  • checkdst :指定証券会社のタイムゾーンが、指定時刻(指定タイムゾーン(未指定時は日本))で夏時間かどうかチェックを行います

具体的な使用方法については、5.検証を参照して下さい

import pytz ,datetime

#ここから 必要があれば追加する。
tzUTC = pytz.timezone("UTC")                  #標準時
tzNYC = pytz.timezone("America/New_York")     #米国(ニューヨーク)
tzTYO = pytz.timezone("Asia/Tokyo")           #日本(東京)
tzLON = pytz.timezone("Europe/London")        #イギリス (ロンドン)
tzYTO = pytz.timezone("America/Toronto")      #カナダ(トロント)
tzSAO = pytz.timezone("America/Sao_Paulo")    #ブラジル(サンパウロ)
tzSYD = pytz.timezone("Australia/Sydney")     #オーストラリア(シドニー)
tzFRA = pytz.timezone("Europe/Berlin")        #ドイツ(フランクフルト) *フランクフルト、ヘッセン州がなかったのでベルリン
#ここまで

def calcdifftime(tz = tzNYC, date = -1,tzbase = -1):
        """
        [param]
        tz : checked pytz.timezone
        date:checked datetime
        tzbase:bassis pytz.timezone

        [return]
        float:different hours
        """
        if(date==-1):
                date =  datetime.datetime.today() 
        if(tzbase==-1):
                tzbase = tzTYO
        tabse   = tzbase.localize(date)
        tztime = tz.localize(date)
        diff = tabse - tztime
        diff_hours = diff.total_seconds()/3600
        return(diff_hours)

def checkdst(tz = tzNYC, date=-1,tzbase=-1):
        """
        [param]
        tz : checked pytz.timezone
        date:checked datetime
        tzbase:bassis pytz.timezone

        [return]
        bool: True:dst , False:std
        """
        if(date==-1):
                date =  datetime.datetime.today() 
        if(tzbase==-1):
                tzbase = tzTYO
        tbase = tzbase.localize(date)
        chgdate = tbase.astimezone(tz)
        #print(chgdate)
        if(chgdate.dst().seconds !=0):
                return(True)
        else:
                return(False)

5. 検証

とりあえず、アメリカ(US)で夏時間開始、終了時間でのチェックを日本時間、現地時間で行っています。

def tztest(t,tz,tzbase = -1):
        diff = calcdifftime(tz,t) #日本との時差
        if(tzbase ==  -1): #tzbase未指定時(日本時間での)動作テスト
                if(checkdst(tz,t)):
                        st = "daylight saving time"
                else:
                        st = "standard time"
        elif(checkdst(tz,t,tzbase)): #tzbase指定時(基本現地時間用)のテスト
                st = "daylight saving time"
        else:
                st = "standard time"
        if(tzbase == -1):
                tzbasename = tzTYO.zone
        else:
                tzbasename = tzbase.zone
        print("Check time ",t,tzbasename)
        print("tz name".ljust(20),"Time diff".ljust(10),"DST STD")
        print(tz.zone.ljust(20),str(diff).ljust(10),st)

print("日本時間でのチェック")
#アメリカ(US)夏時間のチェック
#Check time  2016-03-13 16:00:00 Asia/Tokyo
#tz name              Time diff  DST STD
#America/New_York     -13.0      daylight saving time
t = datetime.datetime(2016, 3, 13, 16, 0)
tztest(t,tzNYC)

#アメリカ(US)の通常時のチェック
#Check time  2016-11-06 15:00:00 Asia/Tokyo
#tz name              Time diff  DST STD
#America/New_York     -14.0      standard time
t = datetime.datetime(2016, 11, 6, 15, 0)
tztest(t,tzNYC)

print("現地時間でのチェック")
#アメリカ(US)夏時間のチェック
#Check time  2016-03-13 03:00:00 America/New_York
#tz name              Time diff  DST STD
#America/New_York     -13.0      daylight saving time
t = datetime.datetime(2016, 3, 13, 3, 0)
tztest(t,tzNYC,tzNYC)

#アメリカ(US)の通常時のチェック
#Check time  2016-11-06 01:00:00 America/New_York
#tz name              Time diff  DST STD
#America/New_York     -14.0      standard time
t = datetime.datetime(2016, 11, 6, 1, 0)
tztest(t,tzNYC,tzNYC)

6. 夏時間チェックの注意点

  • アメリカ(US)の夏時間に変わるのは2016年3月13日2時だからここから夏時間では?、と考えますが、実際に始まった時刻2016年3月13日3時(1時間進んだ時間)に夏時間と判断出来るようになるので注意が必要です。
    標準時間に戻るのは2016年11月6日2時ですが、夏時間と判断出来るのは標準に戻った2016年11月6日1時(1時間戻った)前までのようです。(2016年11月6日1時は標準時間と判断される)
  • ドイツ等も同様のようなので、チェックする時間には注意は必要のようです。
  • 厳密には、おかしな(チェック出来ない)時間が存在してしまいますが、夏時間の開始終了時間は日曜深夜で市場は閉まっているので、気にしなくていいかもしれません。但し、チェックを週1(日曜とか)で行う場合は注意が必要です。

7. その他

  • 今回各国の証券会社ある都市名を参考にしたのですが、その略称をどうするか? 適当?? 結局所在都市の略称にしたのですが、その時参考にしたのが、都市・空港コードというのが使い安いかも?と思って参考にしています。

8. 今回主に参考にしたサイト

non0
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away