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

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

ただいまの
回答率

91.04%

  • Python 3.x

    3727questions

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

pythonで時間の引き算を行う

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 176

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

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

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

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

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

import datetime

#CSVファイルを入力
    csv1 = input('が記録されたCSVファイルを入力してください: ')
    # CSVデータの読み込み
    df = pd.read_csv(csv1, index_col='time', parse_dates=['time'])

# 入力データ処理
    t = input('開始の時刻を入力してください (ex. 10:00:00) : ')
    input_time1 = datetime.datetime.strptime(t, '%H:%M:%S').time()
    # 入力データ処理
    t = input('終了の時刻を入力してください (ex. 10:00:00) : ')
    input_time2 = datetime.datetime.strptime(t, '%H:%M:%S').time()


#ここからがやりたかった箇所
    kyori=例えば50(m)

  start=int(t)
    end=int(t)

    time=end-start
    speed=kyori/time

    print(speed)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2018/01/10 16:46

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

    キャンセル

  • sekaikan_ozaki

    2018/01/10 16:49

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

    キャンセル

回答 5

+3

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

import datetime
dt1 = datetime.datetime.strptime('10:00:00', '%H:%M:%S')
input_time1 = dt1.time()
dt2 = datetime.datetime.strptime('10:00:10', '%H:%M:%S')
input_time2 = dt2.time()

print( (dt2-dt1).total_seconds()) # 10.0

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/10 16:50

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

    キャンセル

  • 2018/01/10 16:55

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

    キャンセル

  • 2018/01/10 17:03

    input_time1 = dt1.time()
    AttributeError: 'datetime.time' object has no attribute 'time'

    というエラーとなりうまくいきませんでした・・・

    キャンセル

  • 2018/01/10 17:19

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

    キャンセル

  • 2018/01/10 17:38

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

    キャンセル

+2

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

start = datetime.datetime.strptime('10:00:00', '%H:%M:%S')
end   = datetime.datetime.strptime('10:10:30', '%H:%M:%S')

seconds = (end - start).seconds
print(seconds, type(seconds))  # 630 <class 'int'>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/10 16:50

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

    キャンセル

  • 2018/01/10 17:03

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

    キャンセル

  • 2018/01/10 17: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'

    どうすればよいでしょうか

    キャンセル

  • 2018/01/10 17:24 編集

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

    キャンセル

  • 2018/01/10 17:38

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

    キャンセル

+1

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

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

#ここからがやりたかった箇所

kyori = 50

start = input_time1
end = intput_time2

time = end - start
speed = kyori / time.total_second()

print(speed)

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

 参考資料

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/10 16:53

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

    キャンセル

  • 2018/01/10 17:00

    おおっと?

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

    キャンセル

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

t1 = int(input_time1.strftime("%H%M%S"))
t2 = int(input_time2.strftime("%H%M%S"))

start = int(t1/10000)*3600 + int(t1%10000/100)*60 + t1%100
end   = int(t2/10000)*3600 + int(t2%10000/100)*60 + t2%100

time = end - start

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    3727questions

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