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

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

新規登録して質問してみよう
ただいま回答率
85.45%
Python 3.x

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

Q&A

解決済

5回答

18115閲覧

pythonで時間の引き算を行う

sekaikan_ozaki

総合スコア65

Python 3.x

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

0グッド

0クリップ

投稿2018/01/10 07:28

編集2018/01/10 07:31

python3.5を使っているプログラミング初心者です。
いつもお世話になっております。

位置情報の変化から物体の速度を算出するプログラムを作っています。
入力するCSVファイルには、
時間のとなりに緯度経度が記載されております。

指定した2つの時間それぞれの位置情報を抜き出すところまでは成功したのですが、
時間がint型のような整数ではないので、うまく時間の引き算ができません。結果、速度が出せず困っています。

例えば、開始の時刻が10:00:00、終了の時刻が10:00:10と入力した時(時:分:秒)、
終了時刻-開始時刻=10(秒)
という風に値を返したいです。

なにかうまい方法はないでしょうか?

python

1import datetime 2 3#CSVファイルを入力 4 csv1 = input('が記録されたCSVファイルを入力してください: ') 5 # CSVデータの読み込み 6 df = pd.read_csv(csv1, index_col='time', parse_dates=['time']) 7 8# 入力データ処理 9 t = input('開始の時刻を入力してください (ex. 10:00:00) : ') 10 input_time1 = datetime.datetime.strptime(t, '%H:%M:%S').time() 11 # 入力データ処理 12 t = input('終了の時刻を入力してください (ex. 10:00:00) : ') 13 input_time2 = datetime.datetime.strptime(t, '%H:%M:%S').time() 14 15 16#ここからがやりたかった箇所 17 kyori=例えば50(m) 18 19  start=int(t) 20 end=int(t) 21 22 time=end-start 23 speed=kyori/time 24 25 print(speed) 26 27

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

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

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

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

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

fuzzball

2018/01/10 07:46

0時を跨ぐ場合のことは考慮しなくてもいいですか?
sekaikan_ozaki

2018/01/10 07:49

そこは今回考慮しないつもりです
guest

回答5

0

datetime型のまま引き算してtimedalta型を得てtotalsecondsで秒数を得ることができます。
参考:pythonで日時の差分を秒単位で出す方法

Python

1import datetime 2dt1 = datetime.datetime.strptime('10:00:00', '%H:%M:%S') 3input_time1 = dt1.time() 4dt2 = datetime.datetime.strptime('10:00:10', '%H:%M:%S') 5input_time2 = dt2.time() 6 7print( (dt2-dt1).total_seconds()) # 10.0

投稿2018/01/10 07:43

編集2018/01/10 07:53
can110

総合スコア38282

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

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

sekaikan_ozaki

2018/01/10 07:50

ここ以外のコードでinput_timeを使っている部分もあり、あまり変えたくないのですが良い方法ないでしょうか・・・???
can110

2018/01/10 07:55

コード修正しました。 単純に input_time? = dt?.time() でよいのでは?
sekaikan_ozaki

2018/01/10 08:03

input_time1 = dt1.time() AttributeError: 'datetime.time' object has no attribute 'time' というエラーとなりうまくいきませんでした・・・
can110

2018/01/10 08:19

回答コードでは正しく動作します。 dt1 = datetime~.time() のように後ろに.time()が付いていませんか?
sekaikan_ozaki

2018/01/10 08:38

無事動作しました! ありがとうございました。
guest

0

timeオブジェクトではなくdatetimeオブジェクトとして扱った方が楽かと。

Python

1start = datetime.datetime.strptime('10:00:00', '%H:%M:%S') 2end = datetime.datetime.strptime('10:10:30', '%H:%M:%S') 3 4seconds = (end - start).seconds 5print(seconds, type(seconds)) # 630 <class 'int'>

投稿2018/01/10 07:39

LouiS0616

総合スコア35660

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

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

sekaikan_ozaki

2018/01/10 07:50

ここ以外のコードでinput_timeを使っている部分もあり、あまり変えたくないのですが良い方法ないでしょうか・・・???
LouiS0616

2018/01/10 08:03

早いタイミングで差分を取ってしまえば、その後は好きに使えるかと思います。
sekaikan_ozaki

2018/01/10 08:20

input_time1 = datetime.datetime.strptime(t, '%H:%M:%S').time() を start = datetime.datetime.strptime('10:00:00', '%H:%M:%S')といった形に変えました。 ~~~~コード~~~~ #CSVファイルを入力 csv1 = input('1の位置情報が記録されたCSVファイルを入力してください: ') # CSVデータの読み込み df = pd.read_csv(csv1, index_col='time', parse_dates=['time']) csv2 = input('2の位置情報が記録されたCSVファイルを入力してください: ') # CSVデータの読み込み df2 = pd.read_csv(csv2, index_col='time', parse_dates=['time']) #変えた箇所 t = input('開始の時刻を入力してください (ex. 10:00:00) : ') start = datetime.datetime.strptime(t, '%H:%M:%S').time() # 入力データ処理 t = input('終了の時刻を入力してください (ex. 10:00:00) : ') end = datetime.datetime.strptime(t, '%H:%M:%S').time() seconds = (end - start).seconds print(seconds, type(seconds)) # DataFrameから上記の時間にマッチする行を抽出 pos1 = df[df.index.time == start]["x"] pos2 = df[df.index.time == start]["y"] # DataFrameから上記の時間にマッチする行を抽出 pos3 = df[df.index.time == end]["x"] pos4 = df[df.index.time == end]["y"] # DataFrameから上記の時間にマッチする行を抽出 pos5 = df2[df2.index.time == start]["x"] pos6 = df2[df2.index.time == start]["y"] # DataFrameから上記の時間にマッチする行を抽出 pos7 = df2[df2.index.time == end]["x"] pos8 = df2[df2.index.time == end]["y"] ~~省略~~~ kyori=50 speed = kyori / seconds ~~~コード終わり~~~~ すると以下のようなエラーが帰ってきてしまいうまくいけませんでした・・ seconds = (end - start).seconds TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time' どうすればよいでしょうか
LouiS0616

2018/01/10 08:24 編集

can110さんが言っていることと全く同じですが、最後の.time()を取り除いてください。 datetime - datetimeは定義されていますが、time - timeは定義されていないのです。
sekaikan_ozaki

2018/01/10 08:38

無事動作しました! ありがとうございました。
guest

0

自己解決

dt1 = datetime~.time() の後ろの.time()を消したことで、無事動作しました。
ご協力していた皆様本当にありがとうございました。

投稿2018/01/10 08:39

sekaikan_ozaki

総合スコア65

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

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

0

想定している回答から少し外れるかもしれませんが、

datetime型での計算結果はtimedelta型で返ってきます。ですので、そのtimedeltaのメソッドtotal_second()を使って計算しましょうか。

python

1#ここからがやりたかった箇所 2 3kyori = 50 4 5start = input_time1 6end = intput_time2 7 8time = end - start 9speed = kyori / time.total_second() 10 11print(speed)

急いで書いたので走り書きのサンプルソースコードは動作検証はしていませんが、参考になれば幸いです。

参考資料

8.1. datetime — 基本的な日付型および時間型 — Python 3.6.3 ドキュメント

投稿2018/01/10 07:49

編集2018/01/10 08:02
manzyun

総合スコア2244

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

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

sekaikan_ozaki

2018/01/10 07:53

TypeError: unsupported operand type(s) for -: 'str' and 'str' のエラーとなっていまいました・・
manzyun

2018/01/10 08:00

おおっと? あ、下の部分そのまま書き写しではできませんでしたね。このコメントを投稿した後にサンプルコードを書き直してみます。
guest

0

原始的ですが、秒単位に変換して引き算。

python

1t1 = int(input_time1.strftime("%H%M%S")) 2t2 = int(input_time2.strftime("%H%M%S")) 3 4start = int(t1/10000)*3600 + int(t1%10000/100)*60 + t1%100 5end = int(t2/10000)*3600 + int(t2%10000/100)*60 + t2%100 6 7time = end - start

投稿2018/01/10 08:18

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問