3

datetime64 型のレコード配列を作成できません。Python 2.7、Numpy 1.7 を実行しています。

最小限の例を次に示します。

p_dtype = np.dtype({"names": ['trns_id', 'trns_date', 'qty', 'price', 'amount', 'description', 'commission', 'fees'],
                    "formats": [long, "M8", float, float, float, "S40", float, float]})

p_row = (8609132959, np.datetime64('2012-05-01'), 337.574, 4.86, -1640.61, 'Bought 337.574 XYZ @ 4.86', 0.0, 0.0)

print p_list, p_dtype

p_array = np.array(p_row, dtype=p_dtype)

次のエラー (& 出力) が表示されます。

TypeError                                 Traceback (most recent call last)
<ipython-input-137-0b4de45b819c> in <module>()
      6 print p_list, p_dtype
      7 
----> 8 p_array = np.array(p_row, dtype=p_dtype)
      9 
     10 print "Array: %s, dtype: %s" % (p_array, p_array.dtype)

TypeError: Cannot cast NumPy timedelta64 scalar from metadata [D] to  according to the rule 'same_kind'

(8609132959.0, numpy.datetime64('2012-05-01'), 337.574, 4.86, -1640.61, 'Bought 337.574 PIMSX @ 4.86', 0.0, 0.0) [('trns_id', '<i8'), ('trns_date', '<M8'), ('qty', '<f8'), ('price', '<f8'), ('amount', '<f8'), ('description', 'S40'), ('commission', '<f8'), ('fees', '<f8')]

ヒント、誰か?

4

2 に答える 2

4

「date」datetime dtype を指定します。つまり、 の"M8[D]"代わりに"M8"、または'datetime64[D]'の代わりに'datetime64'.

In [80]: np.array([(0,np.datetime64('2012-05-17'))],
   ....:          dtype=[('i',np.int),('date','datetime64[D]')])
Out[80]: 
array([(0, datetime.date(2012, 5, 17))], 
      dtype=[('i', '<i8'), ('date', '<M8[D]')])

'2012-05-17'データを単に文字列として (つまり、np.datetime('2012-05-17')オブジェクトの代わりに)フィードすることもできることに注意してください。

In [81]: np.array([(0,'2012-05-17')],
   ....:          dtype=[('i',np.int),('date','datetime64[D]')])
Out[81]: 
array([(0, datetime.date(2012, 5, 17))], 
      dtype=[('i', '<i8'), ('date', '<M8[D]')])

これらの型は、単一の dtype の場合と構造化された dtype の場合では異なるように解釈されるようです。次のような単一の dtype で発生している問題に遭遇することはありません。

In [84]: np.array([np.datetime64('2012-05-17')], dtype='datetime64')   # no need for [D]
Out[84]: array(['2012-05-17'], dtype='datetime64[D]')

In [85]: np.array(['2012-05-17'], dtype='datetime64')   # no need for [D]
Out[85]: array(['2012-05-17'], dtype='datetime64[D]')

しかし、それを構造化すると、問題が発生します。

In [87]: np.array([(0,'2012-05-17')],
   ....:          dtype=[('i',np.int),('date','datetime64')])
---------------------------------------------------------------------------
ValueError: Cannot create a NumPy datetime other than NaT with generic units

In [88]: np.array([(0,np.datetime64('2012-05-17'))],
   ....:          dtype=[('i',np.int),('date','datetime64')])
---------------------------------------------------------------------------
TypeError: Cannot cast NumPy timedelta64 scalar from metadata [D] to  according to the rule 'same_kind'
于 2013-05-17T22:01:33.227 に答える
1

numpy にはdatetime に関するページがあり、かなり重いですが、ほとんどの質問に答えます。

2 つの注意事項:

  • Python の datetime と同じように、日付と時刻の区切り
  • numpy に固有の使用コンテキスト ([*] サフィックス)

上記で発生した問題は、2 番目の種類の問題です。

dtnow = datetime.datetime.now()
numpy.datetime64(dtnow, '[D]')
トレースバック (最新の呼び出しが最後):
  ファイル ""、1 行目、
TypeError: ルール 'same_kind' に従って、datetime.datetime オブジェクトをメタデータ [us] から [D] にキャストできません
numpy.datetime64(dtnow, '[s]')

numpy.datetime64('2015-06-27T14:53:21+0300')

datetime に時間コンポーネントがまったくない場合は、datetime64[D] で十分です。

ただし、もしそうなら、datetime64[s] を第 2 レベルのコンテキストとして使用することをお勧めします。

于 2015-06-27T09:05:05.093 に答える