2017-07-13 10 views
1

は、私は、そのcolumsある日付配列を作成しようとしています。これは非常に簡単でなければならないことは分かっていますが、同様の例は見つかりませんでした。np.datetime64情報をどのようにして別々の列に分けることができますか? <em>日</em>、<em>月</em> 2の間の特定の日付(時間デルタ= 1日)</em>と<em>年:

次のように私はnumpyのdatetime64を使用して日付アレイを作成することができることを私が見つけた:

import numpy as np 
dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31')) 

これは私が必要とする日付のリストを生成するが、私は分割する方法をグーグル/ドキュメントで見つけることができませんそれらをnumpy配列の列に変換します。

アイデア?

ありがとうございます!正規np.arange(例えばnp.arange(1825))のよう

答えて

2
In [25]: dates = np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31')) 
In [26]: dates 
Out[26]: 
array(['2010-01-01', '2010-01-02', '2010-01-03', ..., '2014-12-28', 
     '2014-12-29', '2014-12-30'], dtype='datetime64[D]') 
In [27]: dates.shape 
Out[27]: (1825,) 

、これは、値の範囲に及ぶ1Dアレイを作成します。クリアするために、配列には日付の値を表す数値(浮動小数点数)が含まれています。 ndarrayコードは、これらの数字を解釈するために、特定のdtypeを使用します。配列を表示すると、データはこれらのデータ文字列としてレンダリングされます(dtype[D]の部分によって示されます)。

どのような種類の列が必要ですか?

任意の1次元配列と同じように、あなたがボリュームのベクトルを作成することができます。

In [28]: dates[:,None] 
Out[28]: 
array([['2010-01-01'], 
     ['2010-01-02'], 
     ['2010-01-03'], 
     ..., 
     ['2014-12-28'], 
     ['2014-12-29'], 
     ['2014-12-30']], dtype='datetime64[D]') 

alist = dates.tolist() 
In [59]: alist[:10] 
Out[59]: 
[datetime.date(2010, 1, 1), 
datetime.date(2010, 1, 2), 
datetime.date(2010, 1, 3), 
datetime.date(2010, 1, 4), 
datetime.date(2010, 1, 5), 
datetime.date(2010, 1, 6), 
datetime.date(2010, 1, 7), 
datetime.date(2010, 1, 8), 
datetime.date(2010, 1, 9), 
datetime.date(2010, 1, 10)] 

datetimeオブジェクトのリストを生成します。これらのオブジェクトから年、月、日を繰り返し抽出します。

In [66]: np.array([[x.year, x.month, x.day] for x in alist]) 
Out[66]: 
array([[2010, 1, 1], 
     [2010, 1, 2], 
     [2010, 1, 3], 
     ..., 
     [2014, 12, 28], 
     [2014, 12, 29], 
     [2014, 12, 30]]) 

np.datetime64 dtypeには全く同じものがありません。私たちはそれらをさまざまな単位に変換し、違いを取ることができます。

In [68]: yrs = dates.astype('datetime64[Y]') 
In [69]: yrs 
Out[69]: array(['2010', '2010', '2010', ..., '2014', '2014', '2014'], dtype='datetime64[Y]') 
In [70]: mths = dates.astype('datetime64[M]')-yrs 
In [71]: mths 
Out[71]: array([ 0, 0, 0, ..., 11, 11, 11], dtype='timedelta64[M]') 
In [72]: days = dates - dates.astype('datetime64[M]') 
In [73]: days 
Out[73]: array([ 0, 1, 2, ..., 27, 28, 29], dtype='timedelta64[D]') 

異なるdtypesでは、これらを直接連結することはできません。しかしそれらを整数に変換すると、同じ2次元配列を得ることができます:

In [76]: np.stack((yrs.astype(int), mths.astype(int), days.astype(int)),axis=1) 
Out[76]: 
array([[40, 0, 0], 
     [40, 0, 1], 
     [40, 0, 2], 
     ..., 
     [44, 11, 27], 
     [44, 11, 28], 
     [44, 11, 29]]) 

(年はオフセットが必要です)。

In [77]: np.stack((yrs.astype(int)+1970, mths.astype(int), days.astype(int)),axis=1) 

や '積み重ね' 構造化された配列:

In [78]: np.rec.fromarrays([yrs, mths, days]) 
Out[78]: 
rec.array([('2010', 0, 0), ('2010', 0, 1), ('2010', 0, 2), ..., 
('2014', 11, 27), ('2014', 11, 28), ('2014', 11, 29)], 
      dtype=[('f0', '<M8[Y]'), ('f1', '<m8[M]'), ('f2', '<m8[D]')]) 
+0

私はOPが "日、月、年"の列IIUCを探していると思います。 – DSM

+0

それは私の推測です。しかし、もしそうなら、質問にはっきりと述べるべきです。 – hpaulj

+0

これらの日付を分割することは、それほど些細なことではありません。そのようなdtypeに対して明示的な 'get_month'メソッドや関数を見つけることができません。 'datetime'オブジェクトのリストを扱うか、' datetime64'単位でゲームをする必要があります。 – hpaulj

1

を、それはあなたがパンダを使用することができnumpyの配列であることを持っていない場合 - それ以外の場合は

import numpy as np 
from pandas import DatetimeIndex 
dates = DatetimeIndex(np.arange(np.datetime64('2010-01-01'),np.datetime64('2014-12-31'))) 

date_cols = [[d.year, d.month, d.day] for d in dates] 

、私はnumetimeを避け、datetimeで全体を実行します -

from datetime import datetime, timedelta 

st = datetime(2010, 1, 1) # or datetime.strptime("2010-01-01", "%Y-%m-%d") 
ed = datetime(2014, 12, 31) # or datetime.strptime("2014-12-31", "%Y-%m-%d") 

count = ed - st 
date_cols = [] 
for d in range(count.days+1): 
    date = st + timedelta(days=d) 
    date_cols.append([date.year, date.month, date.day]) 
print(date_cols) 
関連する問題

 関連する問題