我有一个由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()是最快的,所以我会选择这个。谢谢!
答案 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