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
解決策は:
import pandas as pd
ts = pd.to_datetime(str(date))
d = ts.strftime('%Y.%m.%d')
あなたがその変換gobbledygookをしたくなくて、たった1つの日付形式で大丈夫なら、これは私にとって最高の解決策でした
str(t)[:10]
Out[11]: '2012-07-01'
追加の依存関係を必要とせずに、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"
パンダを使用しないルートがあります。ただし、以下の注意事項を参照してください。
さて、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
_を参照してください。