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

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

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

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

Q&A

解決済

2回答

649閲覧

Python_時刻の差分を求めるの巻

City

総合スコア25

Python 3.x

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

0グッド

0クリップ

投稿2018/08/20 02:21

前提・実現したいこと

'プログラム冒頭取得した時間 - プログラム終盤取得した時間'
この、実行時間(と名付けます)というものを求めたいです。
もっと便利な方法はきっと他にもあるのですが、
(よくわからなかったので)
今回は秒単位での差分を求め、
それから(時間,分)に変換しようと頑張ってみました。

発生している問題・エラーメッセージ

こうして求めた実行時間(仮名です)なのですが...
どう考えても結果がおかしいのです。
例えば5分くらいしかたっていないのに、
180時間と-22300分経過したようになっています。
これは計算に致命的な間違いがあるからだと思うんです。
そこで、数ある問題点を指摘していただきたいのです。
それから、秒単位に換算しなくとも
もっと良い方法があるのであれば教えてほしいです!!

該当のソースコード

python

1import datetime 2start=datetime.datetime.now() 3""" 4ここにコード 5くどくどくどくど... 6(質問との関連は無いため省略しました。) 7""" 8end=datetime.datetime.now() 9#ここからです。 10#'end-start'が知りたいのですが、 11#そのままではどうやら無理みたいなので、秒単位に換算してから差分を求めることにしたのですが... 12startlist=list() 13for el in _now_: 14 startlist.append(el) 15startyear=int(startlist[0])*365*24*60*60 16startmonth=int(startlist[1])*60*60*24*30 17startday=int(startlist[2])*60*60*24 18starthour=int(startlist[3])*60*60 19startminute=int(startlist[4])*60 20starttime=startyear+startmonth+startday+starthour+startminute 21#starttimeにはプログラム冒頭取得した時間[秒]が格納されていると信じています 22#同様に、endtimeも求めに行きます。 23_end_=end.timetuple() 24endlist=list() 25for el in _end_: 26 endlist.append(el) 27endyear=int(endlist[0])*365*24*60*60 28endmonth=int(endlist[1])*60*60*24*30 29endday=int(endlist[2])*60*60*24 30endhour=int(endlist[3])*60*60 31endminute=int(endlist[4])*60 32endtime=endyear+endmonth+endday+endhour+endminute 33#このendtimeでも、プログラム終盤取得した時刻[秒]が格納されていたらいいな..と思います 34#気を取り直して、続きです。 35used_sec=endtime-starttime 36#これでused_secには実行時間(と名付けたもの)[秒]が入っているんです(震) 37#そこで、求めた時間の単位[秒]を[時間][分]..と整数に変換していきます 38#実行時間の出力は[時間][分]の単位で行います。 39used_hour=int(used_sec/60*60) 40used_minute=int((used_sec-used_hour*60*60)/60) 41#そうすると、かかった時間が[hour][minute]の単位で得られるわけですね~ 42#しかし、自分は何をしているんだろうというのが正直なところです。 43#どこを見ても、間違っているとしか思えません。 44result=f"{used_hour}[hour] + {sed_minute}[minute]" 45input(result)

補足情報(FW/ツールのバージョンなど)

Windows10, atom

稚拙なコードで気分を悪くされた方には申し訳ないです。

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

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

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

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

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

fuzzball

2018/08/20 02:28

end - start で秒単位の差分が取れると思うのですが、それではダメなのでしょうか?(コードは「#ここからです。」までしか見てません)
mather

2018/08/20 02:35

_now_の定義がないですね。
City

2018/08/20 02:38

end-startのところend-nowとして盲点でした..しかし、取得したtimedelta型の処理がわかりませんでした。
City

2018/08/20 02:38

nowをstartに書き換える際に残ってしまったものと思われます。ご指摘ありがとうございます。
fuzzball

2018/08/20 02:45

「取得したtimedelta型の処理がわかりませんでした」←求めた差分をどうしたいのでしょうか?表示するだけなら(LouiS0616さんの回答にもありますが) print(end - start) でいいですが。
City

2018/08/20 02:47

取得した差分[秒]は'x[時間]y[分]'のような形での出力したいです。
guest

回答2

0

ベストアンサー

end - startで、timedeltaというオブジェクトが生成され、そこから経過時間が取得できます。

python

1td = end - start 2total_sec = td.total_seconds()

timedeltaのメソッドが他にもいくつかあるので、ご確認ください。

8.1.2. timedelta オブジェクト

投稿2018/08/20 02:35

Meganezaru

総合スコア715

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

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

Meganezaru

2018/08/20 02:36

んがー、被りました・・・失礼。
City

2018/08/20 02:44

確かにtimedeltaとでますが、そこからの処理が分からなかったために混乱してしまいました。 type()で型を調べて、それを検索する形でうまくいく予感です。((ヾ(○・ω・)ノ☆・゚::゚
guest

0

実はすごく簡単に書けます。

Python

1import datetime 2 3start = datetime.datetime(2018, 8, 20) 4end = datetime.datetime.now() 5print(start, end) 6 7delta = end - start 8print(type(delta), delta)

実行結果 Wandbox

2018-08-20 00:00:00 2018-08-20 11:27:36.047573 <class 'datetime.timedelta'> 11:27:36.047573

適宜リファレンスを読む癖ができると良いですね。
簡単に理解できる点を拾い読みするだけでも、存外ヒントを得られるものです。
Python 標準ライブラリ » datetime — 基本的な日付型および時間型

投稿2018/08/20 02:28

編集2018/08/20 02:32
LouiS0616

総合スコア35658

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

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

City

2018/08/20 02:41

リファレンスはレベルが高いという先入観を持ってしまいがちなのですが、今回含め行き詰ったときにはわからなくても何とか参考になる情報を探しに行く癖をつけるようにします((ヾ(○・ω・)ノ☆・゚::゚
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問