web-dev-qa-db-ja.com

pythonでnumpy.datetime64を文字列オブジェクトに変換します

python datetime64オブジェクトを文字列に変換するのに問題があります。例:

t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')

に:

'2012.07.01' as a  string. (note time difference)

私はすでにdatetime64オブジェクトをdatetime longに変換してから文字列に変換しようとしましたが、このエラーが発生するようです:

dt = t.astype(datetime.datetime) #1341100800000000000L
time.ctime(dt)
ValueError: unconvertible time
39
cs_newbie

解決策は:

import pandas as pd 
ts = pd.to_datetime(str(date)) 
d = ts.strftime('%Y.%m.%d')
55
cs_newbie

あなたがその変換gobbledygookをしたくなくて、たった1つの日付形式で大丈夫なら、これは私にとって最高の解決策でした

str(t)[:10]
Out[11]: '2012-07-01'
28
citynorman

追加の依存関係を必要とせずに、ISO 8601形式の文字列が必要でした。私のnumpy_arrayには、datetime64として単一の要素があります。 @ Wirawan-Purwantoの助けを借りて、少しだけ追加しました。

from datetime import datetime   

ts = numpy_array.values.astype(datetime)/1000000000
return datetime.utcfromtimestamp(ts).isoformat() # "2018-05-24T19:54:48"
3
four43

パンダを使用しないルートがあります。ただし、以下の注意事項を参照してください。

さて、t変数にはナノ秒の解像度があります。これは、Pythonの検査で表示できます。

_>>> numpy.dtype(t)
dtype('<M8[ns]')
_

これは、この値の整数値がUNIXタイムスタンプの10 ^ 9倍であることを意味します。質問に記載されている値がそのヒントを示しています。最善の方法は、tの整数値を10億で除算することです。その後、_time.strftime_を使用できます。

_>>> import time
>>> time.strftime("%Y.%m.%d", time.gmtime(t.astype(int)/1000000000))
2012.07.01
_

これを使用する際には、次の2つの仮定を意識してください。

1)datetime64の解像度はナノ秒です

2)datetime64に格納されている時刻はUTCです

サイドノート1:興味深いことに、numpy開発者は、マイクロ秒よりも大きい解像度を持つ_datetime64_オブジェクトがlong型。t.astype(datetime.datetime)が_1341100800000000000L_を生成する理由を説明します。理由は、_datetime.datetime_がサポートする解像度はマイクロ秒のみであるため、_datetime.datetime_オブジェクトはナノ秒以上のタイムスケールを正確に表すことができないからです。

サイドノート2:numpy 1.10以前と1.11以降では異なる規則に注意してください:

  • numpy <= 1.10では、datetime64は内部的にUTCとして保存され、現地時間として出力されます。 TZが指定されていない場合、解析は現地時間を想定しています。そうでない場合、タイムゾーンオフセットが考慮されます。

  • numpy> = 1.11では、datetime64はタイムゾーンに依存しない値(1970-01-01 00:00からの不特定のタイムゾーンでの秒数)として内部的に保存され、そのように出力されます。 _+NNNN_スタイルのタイムゾーンシフトは引き続き許可されており、値はUTCに変換されますが、時間解析はタイムゾーンを想定していません。

[1]: https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/datetime.c ルーチン_convert_datetime_to_pyobject_を参照してください。

2