2017-10-26 11 views
0

私はこのようになりますパンダのデータフレームがあります。datetime64タイプに分属性はありませんか?

       date price volume 
0  2017-10-24 01:00:07.870000 51.90  1 
1  2017-10-24 01:00:10.167000 51.90  1 
2  2017-10-24 01:00:11.370000 51.89  -1 
3  2017-10-24 01:00:11.370000 51.89  -6 
4  2017-10-24 01:00:12.573000 51.90  5 
5  2017-10-24 01:00:13.573000 51.89  -2 
6  2017-10-24 01:00:13.776000 51.90  1 
7  2017-10-24 01:00:21.276000 51.89  -1 
8  2017-10-24 01:00:21.276000 51.88  -1 
9  2017-10-24 01:00:21.276000 51.88  -2 
10  2017-10-24 01:00:29.979000 51.89  1 

私は日付の分の属性にnumpyのアレイとのアクセスに変換したい場合は、それが可能だが。

>>> array_df = df.values 

>>> array_df[:,0] = np.array(array_df[:,0], dtype='datetime64[ms]') 

>>> array_df 
array([[datetime.datetime(2017, 10, 24, 1, 0, 7, 870000), 51.9, 1], 
    [datetime.datetime(2017, 10, 24, 1, 0, 10, 167000), 51.9, 1], 
    [datetime.datetime(2017, 10, 24, 1, 0, 11, 370000), 51.89, -1], 
    ..., dtype=object) 

>>> array_df[0][0].minute 
0 

しかし、私は同じdatetime64[ms]型の構造化された配列を作るとき、私はその分の属性にアクセスすることはできません。 date of array_dfがそれを持っているとき

>>> array_structured = np.zeros(10, dtype=[('index', np.int32), 
            ('date', 'datetime64[ms]'), 
            ('price', np.float32), 
            ('neg_value', np.int32), 
            ('pos_value', np.int32)]) 

>>> array_structured 
array([(0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0), 
    (0, '1970-01-01T00:00:00.000', 0., 0, 0)], 
    dtype=[('index', '<i4'), ('date', '<M8[ms]'), ('price', '<f4'), ('neg_value', '<i4'), ('pos_value', '<i4')]) 

>>> array_structured['date'][0] = np.datetime64('2017-10-24 01:00:07.870000') 

>>> array_structured['date'][0].minute 
Traceback (most recent call last): 
File "<console>", line 1, in <module> 
AttributeError: 'numpy.datetime64' object has no attribute 'minute' 

も自分dtypesがdatetime64[ms]と同じであるとき、なぜdate of array_structuredminute attributeを持っていませんか?

+1

'np.datetime64オブジェクトにはそのような属性はありません。 'datetime.datetime'オブジェクトはそうです。 – hpaulj

+0

@hpaulj答えをありがとう。次に、array_df [:、0] = np.array(array_df [:、0]、dtype = 'datetime64 [ms]') 'によってstringをdatetime64に変換したとき、そのdtypeは' datetime64'ではありませんか?構造化された配列を作成するときにdatetiemsを格納するために選択したはずのdtypeの種類を教えてください。 – maynull

+0

@hpauljまたは、np.datetime64オブジェクトから分データを抽出する方法を知りたいです。 – maynull

答えて

2
In [57]: data 
Out[57]: 
array([('1971-01-01T00:00:00.000', 0.), ('1972-01-01T00:00:00.000', 0.), 
     ('2017-10-31T00:00:00.000', 0.)], 
     dtype=[('date', '<M8[ms]'), ('price', '<f4')]) 
In [58]: adate = data['date'][0] 
In [59]: adate 
Out[59]: numpy.datetime64('1971-01-01T00:00:00.000') 

配列の要素には、minuteのような属性はありません。しかしitemまたはtolistPythonに抽出したとき、彼らはdatetimeオブジェクト 'になる':

In [68]: data['date'].tolist() 
Out[68]: 
[datetime.datetime(1971, 1, 1, 0, 0), 
datetime.datetime(1972, 1, 1, 0, 0), 
datetime.datetime(2017, 10, 31, 0, 0)] 

In [61]: adate.item() 
Out[61]: datetime.datetime(1971, 1, 1, 0, 0) 
In [62]: adate.item().minute 
Out[62]: 0 
In [63]: adate.item().year 
Out[63]: 1971 
In [65]: [d.year for d in data['date'].tolist()] 
Out[65]: [1971, 1972, 2017] 

彼らはまた、 'astype' は他の '時間単位' に変換することができます:

In [66]: data['date'].astype('datetime64[Y]') 
Out[66]: array(['1971', '1972', '2017'], dtype='datetime64[Y]') 
In [67]: data['date'].astype('datetime64[m]') 
Out[67]: array(['1971-01-01T00:00', '1972-01-01T00:00', '2017-10-31T00:00'], dtype='datetime64[m]') 
+0

ありがとうございました!私はあなたに感謝しました! :) – maynull

関連する問題