2011-08-03 15 views
2

datetimeというオブジェクトが含まれているため、ハックアップのリスクを冒したくありませんでした。基本的には、次のように変換したいと考えています。どのようにして(最も近い時間)丸めますか?

2010-04-21 06:37:53 -> 2010-04-21 06:40:00 
2010-08-26 02:54:00 -> 2010-08-26 03:00:00 
2010-04-21 06:37:12 -> 2010-04-21 06:40:00 
2010-08-26 11:54:19 -> 2010-08-27 00:00:00 

組み込みの方法がありますか?

+0

「2010-08-26 11:50:00.001」についてはどうですか?それは '11:50'か' 12:00'でしょうか? – robert

+0

ああ..私はマイクロ秒を捨てています。だから、これは '11:50'になるはずです – Legend

答えて

2

時刻をUnixのタイムスタンプに変換し、希望のタイムスタンプを丸める必要があります。

round(Timestamp/60 seconds [minutes conversion]/10 [round precision]) * 60 * 10 [to get the timestamp back]

1

これは私のために働いているようです。

def round_up(tm): 
    upmins = math.ceil(float(tm.minute)/10)*10 
    diffmins = upmins - tm.minute 
    newtime = tm + datetime.timedelta(minutes=diffmins) 
    newtime = newtime.replace(second=0) 
    return newtime 

変換:

2010-04-21 06:37:53 -> 2010-04-21 06:40:00 
2010-08-26 02:54:00 -> 2010-08-26 03:00:00 
2010-04-21 06:37:12 -> 2010-04-21 06:40:00 
2010-08-26 02:54:19 -> 2010-08-26 03:00:00 
2010-04-21 06:35:32 -> 2010-04-21 06:40:00 
0

タイムスタンプに丸め動作します:

MINUTES = 10. 

d = datetime.now() 
t = time.mktime(d.timetuple()) 
t = math.ceil((t // 60)/MINUTES) * 600 
d = datetime.fromtimestamp(t) 
0
dt += datetime.timedelta(minutes=9, seconds=59, microseconds=999999) 
dt.replace(minutes=dt.minutes-(dt.minutes%10), seconds=0, microseconds=0) 

結果は常に切り上げされるように、最初の部分は9分、59.999999秒を追加します。秒の部分は余分な分を減算して10分の境界に戻り、秒を0に設定します。

2

分を四捨五入する必要があります。あなたは秒とマイクロ秒を無視しても、正しい答えを得るでしょう。あなたは、元分の間の時間はtimedeltaを取り、最寄りの10分を四捨五入し、その違いを適用

def round_minutes(t): # t is a datetime object 
    return t - datetime.timedelta(minutes = t.minute - round(t.minute, -1), seconds = t.second, microseconds = t.microsecond) 

は、その場合には、これは1つのライナーです。また、秒とマイクロ秒がゼロになるように、それらをデルタにも追加します。

関連する問題