将pandas Timestamp()调用应用于numpy数组的每个项目

时间:2015-09-04 17:09:06

标签: python arrays numpy pandas

我有一个由numpy.datetime64值组成的numpy数组。我想使用pandas.Timestamp()将这些转换为pandas时间戳。

我可以做一个明确的for循环,如

import numpy as np
import pandas as pd
stamps = [pd.Timestamp(t) for t in my_arr]

但这并不是非常有效。我可以使用numpy的vectorize函数来做这样的事情

stamper = np.vectorize(pd.Timestamp)
stamps = stamper(my_arr)

但numpy文档指出,vectorize主要是一个便利功能,而不是用于性能。有没有更好,更有效的方法来做到这一点?

编辑:以下是一些解决方案的时间安排:

%timeit stamper(my_arr)
%timeit my_arr.astype(pd.Timestamp)
%timeit np.array([pd.Timestamp(t) for t in my_arr])
%timeit pd.to_datetime(my_arr)

100 loops, best of 3: 7.04 ms per loop
10000 loops, best of 3: 82 µs per loop
100 loops, best of 3: 16.8 ms per loop
1000 loops, best of 3: 1.19 ms per loop

似乎.astype()是最快的,所以我会选择这个。谢谢!

2 个答案:

答案 0 :(得分:1)

如果my_arr是一个numpy ndarray,我建议你这样做:

my_arr.astype(pd.Timestamp)

这将创建数组的副本并将其转换为您想要的类型。

答案 1 :(得分:1)

我认为你可以使用矢量化函数pd.to_datetime()

假设您的日期时间字符串不是标准的ISO格式

my_arr = np.array(['8/28/2015 13:46', '8/27/2015 13:26', '8/27/2015 11:46'])
my_arr

array(['8/28/2015 13:46', '8/27/2015 13:26', '8/27/2015 11:46'], 
      dtype='<U15')

使用自定义格式参数

调用矢量化函数pd.to_datetime()
dts = pd.to_datetime(my_arr, format='%m/%d/%Y %H:%M')
dts

DatetimeIndex(['2015-08-28 13:46:00', '2015-08-27 13:26:00',
               '2015-08-27 11:46:00'],
              dtype='datetime64[ns]', freq=None, tz=None)

您可以计算不同时间戳和总秒数之间的差异

dts[0] - dts[-1]

Timedelta('1 days 02:00:00')

(dts[0] - dts[-1]).total_seconds()

93600.0