はじめに
やりたかったこと
- inputで文字列”00:00:00”を入力
- scheduleを使い入力した時間にdefの処理
- 入力した時間の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)
無料でPythonが学ぶオススメ講座
techgym(テックジム)というプログラミングスクールが初心者向けに週4で無料講座を開いてくれています。
プログラミングの勉強法などから教えてくれます。
直接的に自動購入Botのことやスクレイピングについては学べませんが、
Pythonの基礎が学べるので第一歩としておすすめします。
また、参加後には講座についていけなかったり復習したい方向けに解説動画ももらえます。
Python勉強してみたいなーと思っている方は一度参加してみてはいかがでしょうか?
テックジムのサイトはこちら
以下の記事で詳しく書いてみたのでよかったら覗いてみてください。
【無料】ゼロからPython学習したいなら「テックジム」がおすすめ!