将pandas DateTimeIndex转换为Unix时间戳?
将 pandas 的 DateTimeIndex 转换成 Unix 时间的标准方法是什么?这可能不是正确的做法:
[time.mktime(t.timetuple()) for t in my_data_frame.index.to_pydatetime()]
7 个回答
13
其他回答的总结:
df['<time_col>'].astype(np.int64) // 10**9
如果你想保留毫秒,可以用 10**6
来除一下。
47
注意:时间戳就是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
125
因为 DatetimeIndex
在内部其实是 ndarray
,所以你可以直接进行转换,而不需要使用列表推导式(这样会更快)。
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