问与答 将熊猫DateTimeIndex转换为Unix时间?

roy · 2020-03-03 09:29:57 · 热度: 19

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

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

猜你喜欢:
共收到 6 条回复
timmi #1 · 2020-03-03 09:29:57

由于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
kendal #2 · 2020-03-03 09:29:58

注意:时间戳记是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
al #3 · 2020-03-03 09:29:59

其他答案的摘要:

df['<time_col>'].astype(np.int64) // 10**9

如果要保持毫秒除以10**6

ricardo #4 · 2020-03-03 09:30:01

补充其他答案://10**9将进行地板除法,该除法给出过去的完整秒数,而不是以秒为单位的最近值。 如果需要,获得更合理舍入的一种简单方法是在进行地板分隔之前添加5*10**8 - 1

lamar #5 · 2020-03-03 09:30:02

为了解决NaT的问题,上述解决方案将转换为较大的负整数,在pandas> = 0.24中,可能的解决方案是:

def datetime_to_epoch(ser):
    """Don't convert NaT to large negative values."""
    if ser.hasnans:
        res = ser.dropna().astype('int64').astype('Int64').reindex(index=ser.index)
    else:
        res = ser.astype('int64')

    return res // 10**9

在缺少值的情况下,这将返回可为空的int类型'Int64'(ExtensionType pd.Int64Dtype):

In [5]: dt = pd.to_datetime(pd.Series(["2019-08-21", "2018-07-28", np.nan]))                                                                                                                                                                                                    
In [6]: datetime_to_epoch(dt)                                                                                                                                                                                                                                                   
Out[6]: 
0    1566345600
1    1532736000
2           NaN
dtype: Int64

否则为常规int64:

In [7]: datetime_to_epoch(dt[:2])                                                                                                                                                                                                                                               
Out[7]: 
0    1566345600
1    1532736000
dtype: int64
tonio #6 · 2020-03-03 09:30:04

如果您在数据框的datetime列上尝试过此操作:

dframe['datetime'].astype(np.int64) // 10**9

&您正在努力解决以下错误:TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'您可以只使用这两行:

dframe.index = pd.DatetimeIndex(dframe['datetime'])
dframe['datetime']= dframe.index.astype(np.int64)// 10**9
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册