1. ホーム
  2. python

[解決済み] datetime、Timestamp、datetime64の相互変換について

2022-03-23 05:50:55

質問

を変換するにはどうすればよいですか? numpy.datetime64 オブジェクトを datetime.datetime (または Timestamp )?

次のコードでは、datetime、timestamp、datetime64のオブジェクトを作成しています。

import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)

In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)

In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>

In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')

注:Timestampからdatetimeを取得するのは簡単です。

In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)

しかし、どのように datetime または Timestamp から numpy.datetime64 ( dt64 )?

.

更新:私のデータセットでやや厄介な例(おそらく動機となる例)があるようです。

dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

であるべきですが datetime.datetime(2002, 6, 28, 1, 0) でなく、長い(!) ( 1025222400000000000L )...

解決方法は?

変換する場合 numpy.datetime64 から datetime のUTCで時刻を表すオブジェクトです。 numpy-1.8 :

>>> from datetime import datetime
>>> import numpy as np
>>> dt = datetime.utcnow()
>>> dt
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> dt64 = np.datetime64(dt)
>>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
>>> ts
1354650685.3624549
>>> datetime.utcfromtimestamp(ts)
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> np.__version__
'1.8.0.dev-7b75899'

上記の例では、素朴な datetime オブジェクトは np.datetime64 をUTCの時間として扱う。


変換する場合 datetime から np.datetime64 と戻る ( numpy-1.6 ):

>>> np.datetime64(datetime.utcnow()).astype(datetime)
datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)

1つの np.datetime64 オブジェクトのnumpy配列と np.datetime64 .

を考える np.datetime64 についてと同じように np.int8 , np.int16 などのPythonオブジェクト間の変換に同じメソッドを適用します。 int , datetime と対応するnumpyオブジェクトを生成します。

あなたの "nasty example" は正しく動作します。

>>> from datetime import datetime
>>> import numpy 
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
datetime.datetime(2002, 6, 28, 0, 0)
>>> numpy.__version__
'1.6.2' # current version available via pip install numpy

を再現することができますね。 long の値は numpy-1.8.0 としてインストールされます。

pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev

同じ例です。

>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
1025222400000000000L
>>> numpy.__version__
'1.8.0.dev-7b75899'

を返します。 long なぜなら numpy.datetime64 タイプ .astype(datetime) は、次のものと同等です。 .astype(object) は、Python の整数を返す ( long ) の上に numpy-1.8 .

を得るには datetime オブジェクトを作成することができます。

>>> dt64.dtype
dtype('<M8[ns]')
>>> ns = 1e-9 # number of seconds in a nanosecond
>>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
datetime.datetime(2002, 6, 28, 0, 0)

を取得するには datetime64 は、秒を直接使用するものです。

>>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
>>> dt64.dtype
dtype('<M8[s]')
>>> datetime.utcfromtimestamp(dt64.astype(int))
datetime.datetime(2002, 6, 28, 0, 0)

numpyドキュメント は、datetime APIは実験的であり、将来のnumpyのバージョンで変更される可能性があると述べています。