You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含小数秒的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:49:55