日期时间四舍五入到最接近的小时

Haw*_*wky 2 datetime timedelta python-3.x

我有非常类似的问题这一个这一个,但我卡上出现取舍问题。

我有一个来自netCDF文件的时间序列,我正在尝试将它们转换为日期时间格式。时间序列的格式为“自1990年1月1日00:00:00起的天数”。最终,我希望以格式输出.strftime('%Y%m%d.%H%M')。因此,例如,我按如下方式读取了netCDF文件

import netCDF4
nc = netCDF4.Dataset(file_name)
time = np.array(nc['time'][:])
Run Code Online (Sandbox Code Playgroud)

然后我有

In [180]: time[0]
Out[180]: 365
In [181]: time[1]
Out[181]: 365.04166666651145
Run Code Online (Sandbox Code Playgroud)

然后我做了

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
Run Code Online (Sandbox Code Playgroud)

有什么办法可以“舍入”到最近的一个小时,这样我就可以了19910101.0100

Joh*_*ter 8

您可以使用进行四舍五入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
Run Code Online (Sandbox Code Playgroud)

请注意,由于我们使用的replace是值,tzinfo因此将保留未替换的值(例如timezone- )。