如何从np.datetime64中提取小时/分钟/秒

4
我有一个长这样的日期时间对象:t = numpy.datetime64('2020-04-15T13:20:06.810000000')。我想从中提取出13:20:06。我该怎么做呢?尽管我在Stack Overflow上找到了类似问题的答案,但它们都建议使用t.hourt.minute。但是当我尝试这样做时,我会得到一个AttributeError,提示np.datetime64对象没有这些属性。
3个回答

6

将其转换为pandas的时间戳(Timestamp)对象:

import pandas as pd

t1 = pd.Timestamp(t)

然后你可以使用

t1.hour
t1.minute
t1.second

(以及类似于年、月、日等)来获取其中的单个项。

这似乎是对我来说最方便的解决方案。谢谢。 - Ach113
我建议使用该方法而不是转换为datetime.datetime,更简单。 - FObersteiner

4
t.astype(str)[11:19]
'13:20:06'

解释:

t.astype(str)将您的对象更改为固定格式的字符串:

'2020-04-15T13:20:06.810000000'

那么您可以选择您感兴趣的部分。


为什么要这样做,如果你可以提供一个更加优雅的解决方案呢?点击此处查看。 - FObersteiner
2
@MrFuppes,因为我喜欢有选择的东西。 :-) 另一个原因是并不是每个安装了NumPy的人也安装了pandas。 - MarianD
谢谢,我也需要这个,对于datetime64的时间部分,作为一个字符串,这样更方便,如果你想要一个字符串"13:20:06"。顺便说一下,你也可以直接调用str(t)或者t.str()来获取字符串,然后再进行切片操作... - vuvu

2

您也可以使用标准库中的datetime来完成这个任务。与使用pandas相比,它大约快40%,比将其转换为字符串快80%:

import datetime as dt
import numpy as np 

t = np.datetime64("2020-04-15T13:20:06.810000000")
t1 = dt.datetime.utcfromtimestamp(t.tolist() / 1e9)

示例输出

In [47]: t = np.datetime64("2020-04-15T13:20:06.810000000")

In [48]: t1 = dt.datetime.utcfromtimestamp(t.tolist() / 1e9)

In [49]: t1.hour
Out[49]: 13

In [50]: t1.minute
Out[50]: 20

In [51]: t1.second
Out[51]: 6

仅提取小时的速度比较

In [41]: dt.datetime.utcfromtimestamp(t.tolist() / 1e9).hour
Out[41]: 13

In [42]: pd.Timestamp(t).hour
Out[42]: 13

In [43]: int(t.astype(str)[11:13])
Out[43]: 13

In [44]: %timeit dt.datetime.utcfromtimestamp(t.tolist() / 1e9).hour
760 ns ± 23.2 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

In [45]: %timeit pd.Timestamp(t).hour
1.22 µs ± 14 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

In [46]: %timeit int(t.astype(str)[11:13])
3.59 µs ± 48.9 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接