web-dev-qa-db-ja.com

丸め時間Python

Python丸め解像度を制御して、時間に関連するタイプでh/m/s丸め演算を実行するエレガントで効率的でPythonicな方法は何でしょうか?

私の推測では、時間のモジュロ演算が必要になるでしょう。実例:

  • 20:11:13%(10秒)=>(3秒)
  • 20:11:13%(10分)=>(1分13秒)

私が考えることができる関連時間関連タイプ:

  • datetime.datetime\datetime.time
  • struct_time
25
Jonathan

Datetime.datetimeの丸めについては、この関数を参照してください: https://stackoverflow.com/a/10854034/1431079

使用例:

print roundTime(datetime.datetime(2012,12,31,23,44,59,1234),roundTo=60*60)
2013-01-01 00:00:00
15
Le Droid

使用方法はdatetime.timedeltas:

import time
import datetime as dt

hms=dt.timedelta(hours=20,minutes=11,seconds=13)

resolution=dt.timedelta(seconds=10)
print(dt.timedelta(seconds=hms.seconds%resolution.seconds))
# 0:00:03

resolution=dt.timedelta(minutes=10)
print(dt.timedelta(seconds=hms.seconds%resolution.seconds))
# 0:01:13
14
unutbu

時間を秒単位に変換し、その時点から標準のモジュロ演算を使用すると思います。

20:11:13 = _20*3600 + 11*60 + 13_ = 72673秒

_72673 % 10 = 3_

72673 % (10*60) = 73

これは私が考えることができる最も簡単な解決策です。

2
Pierre

両方の時間を秒に変換し、モジュロ演算を行うことができます

from datetime import time

def time2seconds(t):
    return t.hour*60*60+t.minute*60+t.second

def seconds2time(t):
    n, seconds = divmod(t, 60)
    hours, minutes = divmod(n, 60)
    return time(hours, minutes, seconds)

def timemod(a, k):
    a = time2seconds(a)
    k = time2seconds(k)
    res = a % k
    return seconds2time(res)

print(timemod(time(20, 11, 13), time(0,0,10)))
print(timemod(time(20, 11, 13), time(0,10,0)))

出力:

00:00:03
00:01:13
2
utdemir

これにより、質問で尋ねられた解像度に時間データが切り上げられます。

import datetime as dt
current = dt.datetime.now()
current_td = dt.timedelta(hours=current.hour, minutes=current.minute, seconds=current.second, microseconds=current.microsecond)

# to seconds resolution
to_sec = dt.timedelta(seconds=round(current_td.total_seconds()))
print dt.datetime.combine(current,dt.time(0))+to_sec

# to minute resolution
to_min = dt.timedelta(minutes=round(current_td.total_seconds()/60))
print dt.datetime.combine(current,dt.time(0))+to_min

# to hour resolution
to_hour = dt.timedelta(hours=round(current_td.total_seconds()/3600))
print dt.datetime.combine(current,dt.time(0))+to_hour
2
caiohamamura

次のコードスニペットを使用して、次の1時間に丸めます。

import datetime as dt

tNow  = dt.datetime.now()
# round to the next full hour
tNow -= dt.timedelta(minutes = tNow.minute, seconds = tNow.second, microseconds =  tNow.microsecond)
tNow += dt.timedelta(hours = 1)
1
PTH

以下は、毎時丸めの非可逆*バージョンです。

dt = datetime.datetime
now = dt.utcnow()
rounded = dt.utcfromtimestamp(round(now.timestamp() / 3600, 0) * 3600)

同じ原則を異なる期間に適用できます。

* タイムスタンプ情報への変換でタイムゾーン情報が破壊されるため、上記の方法はUTCが使用されることを前提としています

0