numpy datetime64数组舍入到最接近的秒

kd3sttzy  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个datetime64[ns]类型的数组,每个元素看起来都像'2019-08-30T14:02:03.684000000',我如何将值舍入到最接近的秒,这样我就得到了这个例子中的'2019-08-30T14:02:04'
我知道我可以将这些值截断为

t = t.astype('datetime64[s]')

但我特别需要舍入值而不是截断它们,而且numpy 'round'函数似乎不喜欢datetime64[ns]数据类型。

hgtggwj0

hgtggwj01#

您可以通过将np.datetime64转换为datetime.datetime来完成此操作。

import numpy as np
from datetime import datetime, timedelta

dt64 = np.datetime64('2019-08-30T14:02:03.684000000')

# np to datetime object
ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
dt = datetime.utcfromtimestamp(ts)

# Rounding
if dt.microsecond/1000000 > 0.5:
  date = (dt + timedelta(seconds=1)).replace(microsecond=0)
else:
  date = dt.replace(microsecond=0)

# Datetime to np 
date_rounded = np.datetime64(date).astype('datetime64[s]')

输出:
日期时间编号64("2019年8月30日14:02:04")

vtwuwzda

vtwuwzda2#

另一个方便的实用工具,用于按指定的间隔('accuracy')舍入datetime64:

from datetime import datetime
from typing import Union
import numpy as np

UNIX_T0 = np.datetime64('1970-01-01T00:00:00')

def round_t64(time: Union[np.datetime64, datetime], dt: Union[np.timedelta64, int]):
    """
    Round timestamp by dt
    """
    if isinstance(dt, int):
        dt = np.timedelta64(dt, 's')

    if isinstance(time, datetime):
        time = np.datetime64(time)

    return time - (time - UNIX_T0) % dt

使用案例:

# floor to 1 sec
round_t64(np.datetime64(datetime.now()), np.timedelta64(1, 's'))

# ceil to 1 sec
round_t64(np.datetime64(datetime.now()), -np.timedelta64(1, 's'))

# floor to 5 min
round_t64(np.datetime64(datetime.now()), np.timedelta64(5, 'm'))

相关问题