64

パンダのDateTimeIndexを(反復可能な)Unix時間に変換する慣用的な方法は何ですか?これはおそらく行く方法ではありません:

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

7 に答える 7

120

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
于 2013-03-04T14:47:36.513 に答える
46

注: タイムスタンプはナノ秒単位の 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
于 2013-03-04T14:31:21.453 に答える
0

他の回答のコード

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

私の投稿の時点で、次の警告が出力されます。

FutureWarning: .astype(...) を使用して datetime64[ns] 値を int64 にキャストすることは推奨されておらず、将来のバージョンで発生します。代わりに .view(...) を使用してください。

したがって、代わりに次を使用します。

dframe['datetime'].view(np.int64) // 10 ** 9
于 2022-01-27T19:02:00.417 に答える
0

上記のソリューションが大きな負の整数に変換される 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

値が欠落している場合、これは null 許容の 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
于 2019-08-23T14:16:47.217 に答える