2011-08-03 7 views
2

datetime 개체가 포함되어 있기 때문에 해킹이 발생할 위험을 감수하고 싶지 않았습니다. 기본적으로 다음과 같이 변환을 수행하려고합니다.(가장) 10에 가까운 시간을 반올림하는 방법은 무엇입니까?

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

시간을 유닉스 타임 스탬프로 변환하고 원하는대로 타임 스탬프를 반올림해야합니다.

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) 

첫 번째 부분은 구분, 결과는 항상 반올림되도록 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) 

:

는이 경우이 하나의 라이너입니다. 또한 제로 피 초와 마이크로 초까지 델타에도 추가합니다.

관련 문제