Pythonで2回引く


117

私には2つのdatetime.time値がexitありenter、次のようなことを実行したいと考えています。

duration = exit - enter

しかし、私はこのエラーを受け取ります:

TypeError:-: 'datetime.time'および 'datetime.timeでサポートされていないオペランドタイプ

これを正しく行うにはどうすればよいですか?考えられる解決策の1つは、time変数をdatetime変数に変換してから破壊することですが、皆さんはより良い、よりクリーンな方法を持っている必要があると確信しています。

回答:


91

これを試して:

from datetime import datetime, date

datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter)

combine 減算できる日時を作成します。


2
@ IgnacioVazquez-Abramsの要点として、たとえばのdatetime(1,1,1,0,0,0)代わりに使用できますdate.today()
Akavall 14年

25
は組み込み関数なdatetime exitので、名前を付けないでくださいexit
orokusaki

1
python 2.7を使用して、私が持っていないcombine私の方法をdatetimeモジュール: AttributeError: 'module' object has no attribute 'combine'
mtoloo

6
mtoloo:datetimeモジュールがあり、datetime内部にオブジェクトがあります。内部のオブジェクトにはcombineメソッドがあります。単純にインポートする場合datetime(このように:)import datetime、後で行う必要があるのはこれdatetime.datetime.combineです。
gruszczy

1
23:59:59:9999のようにこの関数を呼び出すことが非常にまれなケースです。その場合、date.today() beforeとdate.today()laterは異なる値を返します。date.today()変数に値を与えることをお勧めします。
ramwin 2017年

44

使用する:

from datetime import datetime, date

duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning)

使用date.minは少し簡潔で、真夜中でも機能します。

これはdate.today()、最初の呼び出しが23:59:59に発生し、次の呼び出しが00:00:00に発生した場合に予期しない結果を返す可能性がある場合には当てはまりません。


1
あなたに同意。
ramwin 2017年

27

タイムトライタイムデルタを使用する代わりに:

from datetime import timedelta

t1 = timedelta(hours=7, minutes=36)
t2 = timedelta(hours=11, minutes=32)
t3 = timedelta(hours=13, minutes=7)
t4 = timedelta(hours=21, minutes=0)

arrival = t2 - t1
lunch = (t3 - t2 - timedelta(hours=1))
departure = t4 - t3

print(arrival, lunch, departure)

2
ありがとう。これは、ここでの答えは非常にきれいで、すべてのよりも優れている- stackoverflow.com/questions/3096953/...
Pushpak Dagade

7

datetime.timeこの方法で時間を減算しても意味がないので、これはサポートしていません。datetime.datetimeこれを行う場合は、フルを使用してください。


53
ドメインから2つのdatetime.timeオブジェクトab同じ日のものであることがわかっていればb > a、操作b - aは完全な意味を持ちます。
swalog 14

4
彼らが同じ日でなくても、それはまだ意味があります。少なくともと同じくらい意味arctan(0) = (0, pi, 2pi, ...)がありますが、最初の値以降はこれらの値のいずれも気にしません。だから、4:00 - 20:00ある8:00-それは(もだ32:0056:00、...)が、誰心配?
naught101


7
さらに、Pythonは一貫性を保ちません。2つの時間オブジェクトに対してa-bが無意味である場合、a> bまたはa <bはどのように動作しますか?比較はすでに同じ日を想定していますが、そうでない場合は完全に壊れています。比較のために仮定が行われているため、異なる演算に対して同じ仮定を行うことは完全に一貫しています。
Sean

1
無意味だと言うのは主観的ですが、どこから来たのかわかります。2回加算することは、私にとって意味のない表現のようです。2つの時間値を減算すると、timedeltaが返されるはずです。そのtimedeltaがたまたま負の場合は、そうです。私が知りたいのは、Pythonが時間からtimedeltaを加算または減算して、新しい時間値を返すことができない理由です。
aj.toulan 2018年

7

2つのdatetime.timeオブジェクトがあるので、datetime.timedetlaを使用して2つのtimedeltaを作成し、「-」オペランドを使用して今と同じように減算します。以下は、datetimeを使用せずに2回減算する方法の例です。

enter = datetime.time(hour=1)  # Example enter time
exit = datetime.time(hour=2)  # Example start time
enter_delta = datetime.timedelta(hours=enter.hour, minutes=enter.minute, seconds=enter.second)
exit_delta = datetime.timedelta(hours=exit.hour, minutes=exit.minute, seconds=exit.second)
difference_delta = exit_delta - enter_delta

差分は、あなたの理由で使用できる差分です。


timedeltaオブジェクトをdatetimeに変換することは可能ですか?つまり、difference_delta .seconds()があるのですが、日時オブジェクトまたは時間オブジェクトを取得する方法はありますか?Thx
dejdej 2018

はい。 datetime.min + delta
sourcedelica

6

python timedeltaライブラリは、必要なことを行うはずです。timedelta2つのdatetimeインスタンスを減算すると、A が返されます。

import datetime
dt_started = datetime.datetime.utcnow()

# do some stuff

dt_ended = datetime.datetime.utcnow()
print((dt_ended - dt_started).total_seconds())

4
import datetime

def diff_times_in_seconds(t1, t2):
    # caveat emptor - assumes t1 & t2 are python times, on the same day and t2 is after t1
    h1, m1, s1 = t1.hour, t1.minute, t1.second
    h2, m2, s2 = t2.hour, t2.minute, t2.second
    t1_secs = s1 + 60 * (m1 + 60*h1)
    t2_secs = s2 + 60 * (m2 + 60*h2)
    return( t2_secs - t1_secs)

# using it
diff_times_in_seconds( datetime.datetime.strptime( "13:23:34", '%H:%M:%S').time(),datetime.datetime.strptime( "14:02:39", '%H:%M:%S').time())

3

datetime.time それを行うことはできません-しかし、あなたは使うことができます datetime.datetime.now()

start = datetime.datetime.now()
sleep(10)
end = datetime.datetime.now()
duration = end - start

2

私はあなたと同じような状況にあり、矢印と呼ばれる外部ライブラリを使用することになりました。

これは次のようになります。

>>> import arrow
>>> enter = arrow.get('12:30:45', 'HH:mm:ss')
>>> exit = arrow.now()
>>> duration = exit - enter
>>> duration
datetime.timedelta(736225, 14377, 757451)

1
ここでは、元の質問のように時刻ではなく、完全なdatetimeオブジェクトを減算することを示しています
kleptog
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.