【发布时间】:2015-09-05 21:24:18
【问题描述】:
我有一个由 numpy.datetime64 值组成的 numpy 数组。我想使用 pandas.Timestamp() 将这些转换为 pandas Timestamps。
我可以做一个明确的 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() 是最快的,所以我会用这个。谢谢!
【问题讨论】:
-
pd.DataFrame(my_arr).to_timestamp()不会做你想做的事吗? -
埃德,似乎没有。当我尝试这个时,我得到“'Int64Index'对象没有属性'to_timestamp'”
-
抱歉尝试
pd.DataFrame(my_arr).to_timestamp(axis=1) -
同样的问题。我正在使用 pandas 0.13.1,如果这有什么不同的话。
-
您是否有特别需要时间戳的原因?我认为,如果您只是从 np 数组构造了一个 df,则 dtype 将被保留为 datetime64 是不是还不够?
标签: python arrays numpy pandas