我有一个datetime64[ns]类型的数组,每个元素看起来都像'2019-08-30T14:02:03.684000000',我如何将值舍入到最接近的秒,这样我就得到了这个例子中的'2019-08-30T14:02:04'?我知道我可以将这些值截断为
'2019-08-30T14:02:03.684000000'
'2019-08-30T14:02:04'
t = t.astype('datetime64[s]')
但我特别需要舍入值而不是截断它们,而且numpy 'round'函数似乎不喜欢datetime64[ns]数据类型。
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")
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'))
2条答案
按热度按时间hgtggwj01#
您可以通过将np.datetime64转换为datetime.datetime来完成此操作。
输出:
日期时间编号64("2019年8月30日14:02:04")
vtwuwzda2#
另一个方便的实用工具,用于按指定的间隔('accuracy')舍入datetime64:
使用案例: