如何将含小数秒的numpy秒数组转换为datetime格式?
将带小数的秒数numpy数组转换为datetime格式
问题场景
你有一个存储一天中带小数秒数的numpy.ndarray,示例代码如下:
import numpy as np sec = [40389.66574375, 40390.12063928, 40391.32714992, 40392.64457077, 40393.48519607, 40394.20021267] UTCs = np.array([sec])
打印数组结果:
print(UTCs) [[40389.66574375 40390.12063928 40391.32714992 40392.64457077 40393.48519607 40394.20021267]]
尝试直接用np.datetime64('1970-01-01T00:00:00') + UTCs转换失败,原因是np.datetime64的加法要求增量为整数(对应指定的时间单位),而你的秒数包含小数。
解决方案
方法1:纯numpy实现(毫秒精度)
因为需求是最多保留三位小数,对应毫秒精度,可以把秒数转换为整数毫秒后再进行时间运算:
import numpy as np sec = [40389.66574375, 40390.12063928, 40391.32714992, 40392.64457077, 40393.48519607, 40394.20021267] UTCs = np.array([sec]) # 1. 将秒数转换为整数毫秒(四舍五入保留三位小数) ms = np.round(UTCs * 1000).astype(np.int64) # 2. 指定起始时间为毫秒精度的datetime64 start_time = np.datetime64('1970-01-01T00:00:00', 'ms') # 3. 计算得到datetime数组 mytime = start_time + ms print(mytime)
输出结果:
[[1970-01-01T11:13:09.666 1970-01-01T11:13:10.121 1970-01-01T11:13:11.327 1970-01-01T11:13:12.645 1970-01-01T11:13:13.485 1970-01-01T11:13:14.200]]
如果需要截断小数而非四舍五入,可以把np.round换成np.floor,或者直接强制转换为整数:
# 截断方式 ms = (UTCs * 1000).astype(np.int64)
方法2:使用pandas简化操作(若允许依赖)
如果项目中已经引入pandas,处理会更简洁:
import numpy as np import pandas as pd sec = [40389.66574375, 40390.12063928, 40391.32714992, 40392.64457077, 40393.48519607, 40394.20021267] UTCs = np.array([sec]) # 直接转换并保留毫秒精度 mytime = pd.to_datetime(UTCs, unit='s', origin='1970-01-01').round('ms') # 如需转回numpy datetime64数组 mytime_np = mytime.to_numpy() print(mytime_np)
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

