0

设置场景:我有一个 dtype int64 的 Series 对象。我需要将这些转换为仅包含日期的日期时间对象(没有小时和秒)

到目前为止我有什么工作......

foo.head() =

0    1382400000
1    1382400000
2    1382054400
3    1381708800
4    1380758400
Name: da_0, dtype: int64

这个功能:

def convert_stamp_to_date(stamp):
    try:
        d = datetime.datetime.utcfromtimestamp(stamp)
    except:
        d = datetime.datetime.utcfromtimestamp(0)
    d = datetime.datetime(d.year, d.month, d.day)
    return d

当我处理有问题的系列时,我会打电话给:

foo = foo.apply(lambda x: convert_stamp_to_date(x))

这给了我正确的解决方案:

0   2013-10-22 00:00:00
1   2013-10-22 00:00:00
2   2013-10-18 00:00:00
3   2013-10-14 00:00:00
4   2013-10-03 00:00:00
Name: da_0, dtype: datetime64[ns]

这给了我想要的东西,但是我发现它很慢(应该是,对吧?因为它只是做这项工作的幼稚方式)。

对于长度约为 5000 的小型系列对象,平均需要约 27 毫秒来完成转换。不错……但是,我可以轻松地拥有增长到数百万行的 Series 对象对于那些,我看到转换时间进入 1-2 分钟范围。与我用相同大小的系列和数据帧做的其他事情相比,这似乎太慢了。

我的第一个想法是尝试使用np.vectorize. 但是,这实际上使转换了大约 10 倍。

vconvert_stamp_to_date = np.vectorize(convert_stamp_to_date)
foo = foo.apply(lambda x: vconvert_stamp_to_date(x))

虽然这仍然给了我正确的答案,但它会将较小系列对象的转换时间提高到大约 350 毫秒,而对于我使用的较大系列,我不得不 ctrl+c 退出脚本,因为它花费的时间太长.

将时间戳转换为日期时间对象将成为我程序的瓶颈对我来说似乎有点荒谬:(我必须相信在某处有更有效的方法可以做到这一点。谁能指出我正确的方向?暂时我的pandas法力已经用完了,如果你一直读到这里,我非常感激。

谢谢你。

4

1 回答 1

5

这些看起来像纪元秒,所以只需使用pd.to_datetime

In [12]: arr = [1382400000] * 1000000

In [14]: pd.to_datetime(arr,unit='s')
Out[14]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-10-22 00:00:00, ..., 2013-10-22 00:00:00]
Length: 1000000, Freq: None, Timezone: None

In [15]: %timeit pd.to_datetime(arr,unit='s')
10 loops, best of 3: 122 ms per loop
于 2013-10-31T16:00:35.710 回答