将日期时间舍入到最近的小时

时间:2018-01-05 05:24:01

标签: python-3.x datetime timedelta

我有一个与this onethis one非常相似的问题,但我仍然遇到了一些问题。

我有一个netCDF文件的时间序列,我试图将它们转换为日期时间格式。时间序列的格式是自1990-01-01 00:00:00'以来的天数。最终我希望以.strftime('%Y%m%d.%H%M')格式输出。例如,我按如下方式阅读了我的netCDF文件

import netCDF4
nc = netCDF4.Dataset(file_name)
time = np.array(nc['time'][:])

然后我

In [180]: time[0]
Out[180]: 365
In [181]: time[1]
Out[181]: 365.04166666651145

然后我做了

In [182]: start = datetime.datetime(1990,1,1)
In [183]: delta = datetime.timedelta(time[1])
In [184]: new_time = start + delta
In [185]: print(new_time.strftime('%Y%m%d.%H%M'))
19910101.0059

有没有一种方法可以绕#34;到最近的一小时,我得到19910101.0100

2 个答案:

答案 0 :(得分:5)

您可以使用datetime.replace()向下舍入,然后使用datetime.timedelta(hours=1)向上舍入值向上舍入一小时。

import datetime

def round_to_hour(dt):
    dt_start_of_hour = dt.replace(minute=0, second=0, microsecond=0)
    dt_half_hour = dt.replace(minute=30, second=0, microsecond=0)

    if dt >= dt_half_hour:
        # round up
        dt = dt_start_of_hour + datetime.timedelta(hours=1)
    else:
        # round down
        dt = dt_start_of_hour

    return dt

请注意,由于我们正在使用replace,因此我们不会替换我们未替换的值(例如时区 - tzinfo)。

答案 1 :(得分:0)

我不认为datetime提供了一种循环时间的方法,您必须提供自己完成的代码。这样的事情应该有效:

def round_to_hour(dt):
    round_delta = 60 * 30
    round_timestamp = datetime.datetime.fromtimestamp(dt.timestamp() + round_delta)
    round_dt = datetime.datetime.fromtimestamp(round_timestamp)

    return round_dt.replace(microsecond=0, second=0, minute=0)