72

datetime64 タイプの配列があります。

dates = np.datetime64(['2010-10-17', '2011-05-13', "2012-01-15"])

np.array of years を取得するためだけに各要素をループするよりも良い方法はありますか:

years = f(dates)
#output:
array([2010, 2011, 2012], dtype=int8) #or dtype = string

安定した numpy バ​​ージョン 1.6.2 を使用しています。

4

12 に答える 12

50

numpy では datetime が安定していないため、これには pandas を使用します。

In [52]: import pandas as pd

In [53]: dates = pd.DatetimeIndex(['2010-10-17', '2011-05-13', "2012-01-15"])

In [54]: dates.year
Out[54]: array([2010, 2011, 2012], dtype=int32)

Pandas は内部で numpy の datetime を使用していますが、これまでの numpy の不足を回避しているようです。

于 2012-11-30T19:59:02.333 に答える
18

これを行うにはもっと簡単な方法があるはずですが、何をしようとしているのかによっては、通常のPython の datetime オブジェクトに変換するのが最善の方法かもしれません。

datetime64Obj = np.datetime64('2002-07-04T02:55:41-0700')
print datetime64Obj.astype(object).year
# 2002
print datetime64Obj.astype(object).day
# 4

以下のコメントに基づいて、これは Python 2.7.x および Python 3.6+ でのみ機能するようです

于 2016-02-09T00:21:42.553 に答える
4

を使用dates.tolist()してネイティブの日時オブジェクトに変換してから、単にアクセスしますyear。例:

>>> dates = np.array(['2010-10-17', '2011-05-13', '2012-01-15'], dtype='datetime64')
>>> [x.year for x in dates.tolist()]
[2010, 2011, 2012]

これは基本的にhttps://stackoverflow.com/a/35281829/2192272で公開されているのと同じ考え方ですが、より単純な構文を使用しています。

Python 3.6 / numpy 1.18 でテスト済み。

于 2020-02-07T11:44:09.473 に答える
1

numpy 1.7 (datetime はまだ実験的なラベルが付けられている) にアップグレードすると、次のように動作するはずです。

dates/np.timedelta64(1,'Y')
于 2012-11-30T16:47:30.840 に答える
0

残念ながら直接的な方法はまだありませんが、いくつかの間接的な方法があります。

[dt.year for dt in dates.astype(object)]

また

[datetime.datetime.strptime(repr(d), "%Y-%m-%d %H:%M:%S").year for d in dates]

どちらもここの例に触発されています。

これらは両方とも Numpy 1.6.1 で動作します。datetime64 の repr() には小数点の後に小数部分がある可能性があるため、2 番目のものにはもう少し注意する必要があるかもしれません。

于 2012-11-30T23:07:41.913 に答える