390

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')

注: タイムスタンプから日時を取得するのは簡単です。

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

しかし、 ( )からdatetimeorを抽出するにはどうすればよいでしょうか。Timestampnumpy.datetime64dt64

.

更新:私のデータセットのやや厄介な例(おそらく動機付けの例)は次のようです:

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

これはdatetime.datetime(2002, 6, 28, 1, 0)、長い (!) ( 1025222400000000000L) ではなく である必要があります...

4

14 に答える 14

175

地獄へようこそ。

pandas.Timestampdatetime64 オブジェクトを次の場所に渡すだけです。

In [16]: Timestamp(numpy.datetime64('2012-05-01T01:00:00.000000'))
Out[16]: <Timestamp: 2012-05-01 01:00:00>

NumPy 1.6.1 ではこれが正しく機能しないことに気付きました:

numpy.datetime64('2012-05-01T01:00:00.000000+0100')

また、pandas.to_datetime使用することもできます (これは開発バージョンから外れており、v0.9.1 をチェックしていません):

In [24]: pandas.to_datetime('2012-05-01T01:00:00.000000+0100')
Out[24]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))
于 2012-12-06T22:40:22.060 に答える
170

の UTC で時刻を表すオブジェクトに変換するnumpy.datetime64には:datetimenumpy-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'

上記の例では、naiveオブジェクトが によってUTC の時刻としてdatetime解釈されることを前提としています。np.datetime64


に変換datetimenp.datetime64て元に戻すには ( numpy-1.6):

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

単一のnp.datetime64オブジェクトと numpy 配列の両方で機能しますnp.datetime64

、 などについて考えるのnp.datetime64と同じ方法を考えnp.int8np.int16同じメソッドを適用して 、 などの Python オブジェクトと対応する numpy オブジェクトを変換しintますdatetime

あなたの「厄介な例」は正しく機能します:

>>> 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'

longfornumpy.datetime64型はPython 整数 ( )を返す.astype(datetime)と同等であるため、返されます。.astype(object)longnumpy-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 バ​​ージョンで変更される可能性があります。

于 2012-12-04T13:42:08.067 に答える
35
>>> dt64.tolist()
datetime.datetime(2012, 5, 1, 0, 0)

For DatetimeIndex, the tolist returns a list of datetime objects. For a single datetime64 object it returns a single datetime object.

于 2012-12-04T13:22:10.337 に答える
15

pandas の一連の datetime 全体を通常の python datetimes に変換する場合は、.to_pydatetime().

pd.date_range('20110101','20110102',freq='H').to_pydatetime()

> [datetime.datetime(2011, 1, 1, 0, 0) datetime.datetime(2011, 1, 1, 1, 0)
   datetime.datetime(2011, 1, 1, 2, 0) datetime.datetime(2011, 1, 1, 3, 0)
   ....

タイムゾーンもサポートしています:

pd.date_range('20110101','20110102',freq='H').tz_localize('UTC').tz_convert('Australia/Sydney').to_pydatetime()

[ datetime.datetime(2011, 1, 1, 11, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
 datetime.datetime(2011, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
....

: Pandas シリーズを操作している場合、to_pydatetime()シリーズ全体を呼び出すことはできません。.to_pydatetime()リスト内包表記などを使用して、個々の datetime64 を呼び出す必要があります。

datetimes = [val.to_pydatetime() for val in df.problem_datetime_column]
于 2014-08-15T09:41:31.853 に答える
13

1 つのオプションは、 を使用strしてからto_datetime(または同様の方法で):

In [11]: str(dt64)
Out[11]: '2012-05-01T01:00:00.000000+0100'

In [12]: pd.to_datetime(str(dt64))
Out[12]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))

注: 「オフセット対応」dtになっているため、等しくありません:

In [13]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[13]: datetime.datetime(2012, 5, 1, 1, 0)

これはエレガントではないようです。

.

更新:これは「厄介な例」に対処できます:

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

In [22]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[22]: datetime.datetime(2002, 6, 28, 1, 0)
于 2012-12-04T13:08:29.863 に答える
0
import numpy as np
import pandas as pd 

def np64toDate(np64):
    return pd.to_datetime(str(np64)).replace(tzinfo=None).to_datetime()

この関数を使用して、pythons ネイティブの日時オブジェクトを取得します

于 2016-06-05T16:04:56.750 に答える
-1

実際、これらの日時型はすべて難しく、問題になる可能性があります (タイムゾーン情報を注意深く追跡する必要があります)。これが私が行ったことですが、少なくともその一部が「設計によるものではない」ことを懸念していることは認めます。また、必要に応じてこれをもう少しコンパクトにすることもできます。numpy.datetime64 dt_a で始まる:

dt_a

numpy.datetime64('2015-04-24T23:11:26.270000-0700')

dt_a1 = dt_a.tolist() # UTC の datetime オブジェクトを生成しますが、tzinfo はありません

dt_a1

日時.日時(2015, 4, 25, 6, 11, 26, 270000)

# now, make your "aware" datetime:

dt_a2=datetime.datetime(*list(dt_a1.timetuple()[:6]) + [dt_a1.マイクロ秒], tzinfo=pytz.timezone('UTC'))

...もちろん、必要に応じて 1 行に圧縮できます。

于 2015-08-04T18:37:14.723 に答える