KOSEN{BLOG}について

Python 時間演算で詰まったこと

はじめに

やりたかったこと

  1. inputで文字列”00:00:00”を入力
  2. scheduleを使い入力した時間にdefの処理
  3. 入力した時間のn分前にdefの処理

例えば19:00:00を入力したらその2分前にdefの処理を行いたい。

出来たうれしさで問題をあまり覚えてなかったのでザックリの説明になります。
ご了承ください。

エラーの内容は

例外が発生しました: TypeError

unsupported operand type(s) for -: ‘datetime.time’ and ‘datetime.timedelta’

環境

  • Windows10 64bit
  • Python 3.8.2

問題

strptime()メソッドを用いることで文字列からdatetime, dateへの変換は下のコードでできます。

import datetime
import time

start=input("開始時間>")
start1 = datetime.datetime.strptime(start, '%H:%M:%S').time()

からのネットを調べた結果

期間を表す引数(weeks, days, hours, minutes, seconds)をtimedelta()メソッドに渡すことで、timedeltaオブジェクトが生成され、計算に使いやすいということらしいです。

なので、純粋に

start2 = start1 - datetime.timedelta(minutes=1)

のようにしましたがもちろんエラーが出るんですよね。

例外が発生しました: TypeError

unsupported operand type(s) for -: ‘datetime.time’ and ‘datetime.timedelta’

型が違うとかなんとか汗

原因と対処

pythonのdatetimeには、日付を表すdate型と時刻を表すtime型、両方を表すdatetime型があるらしく
timedeltaはdatetime型を元に計算するので、date型、time型はまずdatetime型への変換が必要になるみたいです。
変換にはclassmethod datetime.combine()を使う。

start2 = datetime.datetime.combine(datetime.date.today(), start1) - datetime.timedelta(minutes=1)

のようにすることで計算できました。

しかし、scheduleでこの計算した値を使いたいので、次は文字列に変換します。

strftime()メソッドでできます。

start3 = start2.strftime("%H:%M:%S")

完成

import datetime
import schedule
from datetime import timedelta
import time

start=input("開始時間>")

start1 = datetime.datetime.strptime(start, '%H:%M:%S').time()
start2 = datetime.datetime.combine(datetime.date.today(), start1) - datetime.timedelta(minutes=1)
start3 = start2.strftime("%H:%M:%S")


def Login():
    print(datetime.datetime.now())
    print("ログイン出来ました。")


def Main():
    print(datetime.datetime.now())
    print("tiket-get")
   

schedule.every().day.at(start3).do(Login)  
schedule.every().day.at(start).do(Main)  
while True:
  schedule.run_pending()
  time.sleep(1)

コメントを残す

メールアドレスが公開されることはありません。