numpy datetime64 を使用して現在の日付と時刻を取得するにはどうすればよいですか?
そして、各要素がdatetime64値であるnumpy配列が与えられた場合、どうすれば秒単位で差を得ることができますか?
datetime モジュールを使用して現在の日付を取得し、それを datetime64 に渡すことができます
import numpy as np
import datetime
current = np.datetime64(datetime.datetime.now())
現在の日時がわかったので、numpy の datetime64 ドキュメントを調べて、提供されている例に従うことをお勧めします。timedelta64 の例は特に役立つはずです。
具体的な例として、次のことを検討してください。
import numpy as np
import datetime
current = np.datetime64(datetime.datetime.now())
sample = [np.datetime64('2013-10-22T03:30Z'),
np.datetime64('2013-10-22T04:40Z'),
np.datetime64('2013-10-22T05:50Z')]
diff = [current-t for t in sample]
diffSec = [t.item().seconds for t in diff]
このコードは、現在の時間からサンプル時間までの差 (秒単位) を含む diffSec 配列になります。
Out[2]: [1723, 1818, 1913]
説明:
現在の時刻を使用して差を計算しているため、明らかにこれらの正確な結果は再現できません。
指定された時間の最後に Z を指定すると、時間は Zulu 形式になります。これは、python numpy ライブラリでは非推奨になっています。(Github の問題: https://github.com/pandas-dev/pandas/issues/12100 )。
In [1]: import numpy as np
In [2]: import datetime
現在の日付には、次を使用できます。
In [3]: current = np.datetime64(datetime.datetime.now())
タイムゾーンに従って時間を変更しようとすると、たとえば次のようになります。
In [3]: previous_date = np.datetime64('2011-01-01T00:00:00-0530')
また
In [3]: previous_date = np.datetime64('2011-01-01T00:00:00Z')
次に、DeprecationWarning を取得します。すでに廃止されているバージョンを使用している場合は、次のコードを使用できます
In [3]: delta = np.timedelta64(5,'h')
In [4}: previous_date = np.datetime64('2011-01-01T00:00:00') + delta
t1
配列とスカラーの差を計算するとしますt0
(両方とも配列またはスカラーである可能性があります)。
In [1]: import numpy as np
In [2]: t1=np.arange('2001-01-01T00:00', '2001-01-01T00:05', dtype='datetime64')
In [3]: t1
Out[3]:
array(['2001-01-01T00:00-0200', '2001-01-01T00:01-0200',
'2001-01-01T00:02-0200', '2001-01-01T00:03-0200',
'2001-01-01T00:04-0200'], dtype='datetime64[m]')
In [4]: t0=np.datetime64('2001-01-01T00:00:00')
In [5]: t0
Out[5]: numpy.datetime64('2001-01-01T00:00:00-0200')
numpy で時差を計算する最良の方法は、timedelta64 を使用することです。上記の例でt0
は、 は分単位、t1
は秒単位です。時間差を計算するとき、それらは両方ともより小さい単位 (秒) に変換されます。timedelta64 オブジェクトを作成するには、それらを減算するだけです。
In [6]: t1-t0
Out[6]: array([ 0, 60, 120, 180, 240], dtype='timedelta64[s]')
数値形式での応答が必要な場合は、
In [7]: (t1-t0).astype('int')
Out[7]: array([ 0, 60, 120, 180, 240])
for
構造体を使用して配列をスキャンしたことがないことに注意してください。ベクトル化が妨げられるため、効率が低下します。