【问题标题】:Applying pandas Timestamp() call to each item of a numpy array将 pandas Timestamp() 调用应用于 numpy 数组的每个项目
【发布时间】: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


【解决方案1】:

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

my_arr.astype(pd.Timestamp)

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

【讨论】:

    【解决方案2】:

    我认为你可以只使用矢量化函数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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 2018-07-11
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多