将熊猫日期时间索引转换为Unix时间?

问题描述:

将pandas DateTimeIndex转换为(可迭代的)Unix时间的惯用方式是什么? 这可能不是要走的路:将熊猫日期时间索引转换为Unix时间?

[time.mktime(t.timetuple()) for t in my_data_frame.index.to_pydatetime()] 

由于DatetimeIndexndarray在引擎盖下,你可以做转换没有理解(更快)。

In [1]: import numpy as np 

In [2]: import pandas as pd 

In [3]: from datetime import datetime 

In [4]: dates = [datetime(2012, 5, 1), datetime(2012, 5, 2), datetime(2012, 5, 3)] 
    ...: index = pd.DatetimeIndex(dates) 
    ...: 
In [5]: index.astype(np.int64) 
Out[5]: array([1335830400000000000, 1335916800000000000, 1336003200000000000], 
     dtype=int64) 

In [6]: index.astype(np.int64) // 10**9 
Out[6]: array([1335830400, 1335916800, 1336003200], dtype=int64) 

%timeit [t.value // 10 ** 9 for t in index] 
10000 loops, best of 3: 119 us per loop 

%timeit index.astype(np.int64) // 10**9 
100000 loops, best of 3: 18.4 us per loop 
+0

我很烦,我不记得如何作为一个数组访问它,当然它是'.as_type(int64)':) – 2013-03-04 14:58:43

+0

@AndyHayden - 通常情况下它是相反的:) – root 2013-03-04 15:04:32

注:时间戳就是UNIX时间纳秒(10 ** 9,从而将其划分):

[t.value // 10 ** 9 for t in tsframe.index] 

例如:

In [1]: t = pd.Timestamp('2000-02-11 00:00:00') 

In [2]: t 
Out[2]: <Timestamp: 2000-02-11 00:00:00> 

In [3]: t.value 
Out[3]: 950227200000000000L 

In [4]: time.mktime(t.timetuple()) 
Out[4]: 950227200.0 

作为@root指出它的速度更快,以值的阵列直接提取:

tsframe.index.astype(np.int64) // 10 ** 9 
+0

这是很尴尬的容易...(我可以发誓,我试过t.value,原来我只尝试tsframe.index.value) – 2013-03-04 14:43:02

+0

@ChristianGeier这只是容易,当你知道答案! 'tsframe.index.values'是不同的......令人困惑。 – 2013-03-04 14:44:27