9

我有一个名为dt. 每个元素都是 type datetime.timedelta。例如:

>>>dt[0]
datetime.timedelta(0, 1, 36000)

如何转换为仅包含秒而不循环dt的数组?dt_sec我目前的解决方案(可行,但我不喜欢)是:

dt_sec = zeros((len(dt),1))
for i in range(0,len(dt),1):
    dt_sec[i] = dt[i].total_seconds()

我尝试使用dt.total_seconds(),但它当然没有用。关于如何避免这个循环的任何想法?

谢谢

4

5 回答 5

13

numpy有自己的datetimetimedelta格式。只需使用它们;)。

设置例如:

import datetime
import numpy

times = numpy.array([datetime.timedelta(0, 1, 36000)])

代码:

times.astype("timedelta64[ms]").astype(int) / 1000
#>>> array([ 1.036])

由于人们似乎没有意识到这是最好的解决方案,以下是timedelta64数组与datetime.datetime数组的一些时序:

SETUP="
import datetime
import numpy

times = numpy.array([datetime.timedelta(0, 1, 36000)] * 100000)
numpy_times = times.astype('timedelta64[ms]')
"

python -m timeit -s "$SETUP" "numpy_times.astype(int) / 1000"
python -m timeit -s "$SETUP" "numpy.vectorize(lambda x: x.total_seconds())(times)"
python -m timeit -s "$SETUP" "[delta.total_seconds() for delta in times]"

结果:

100 loops, best of 3: 4.54 msec per loop
10 loops, best of 3: 99.5 msec per loop
10 loops, best of 3: 67.1 msec per loop

初始转换所花费的时间大约是向量化表达式的两倍,但从那时到该timedelta数组的永久转换的每个操作将快大约 20 倍。


如果您永远不会再使用那些timedeltas,请考虑问自己为什么首先制作了 deltas(而不是timedelta64s),然后使用该numpy.vectorize表达式。它不那么原生,但由于某种原因它更快。

于 2013-09-26T21:41:48.900 回答
11
import numpy as np

helper = np.vectorize(lambda x: x.total_seconds())
dt_sec = helper(dt)
于 2013-09-26T21:38:09.817 回答
1

一种方便而优雅的方法是使用 apandas.Series和使用dt.total_seconds属性:

import numpy as np
import pandas as pd

# create example datetime arrays
arr1 = np.array(['2007-07-13', '2006-01-13', '2010-08-13'], dtype='datetime64')
arr2 = np.array(['2007-07-15', '2006-01-18', '2010-08-22'], dtype='datetime64')

# timedelta array
td = arr2 - arr1

# get total seconds
pd.Series(td).dt.total_seconds()
0    172800.0
1    432000.0
2    777600.0
dtype: float64
于 2020-08-08T11:31:58.710 回答
0

我喜欢prgaonp.vectorize建议的使用。如果您只想要一个 Python 列表,您还可以执行以下操作:

dt_sec = map(datetime.timedelta.total_seconds, dt)
于 2013-09-26T21:46:02.520 回答
-3

您可以使用“列表理解”:

dt_sec = [delta.total_seconds() for delta in dt]

在幕后,numpy 应该将其转化为非常快速的操作。

于 2013-09-26T21:40:04.513 回答