2016-10-20 30 views
4

私は、フォームの日付の2次元配列を持っているのリストにnumpyの配列を変換しますは、日付時刻

[Y Y Y ... ] 
[M M M ... ] 
[D D D ... ] 
[H H H ... ] 
[M M M ... ] 
[S S S ... ] 

だから1にこれを変換するための最良の方法だろう何

data = np.array([ 
    [2015, 2015, 2015, 2015, 2015, 2015], # ... 
    [ 1, 1, 1, 1, 1, 1], 
    [ 1, 1, 1, 2, 2, 2], 
    [ 23, 23, 23, 0, 0, 0], 
    [ 4, 5, 5, 37, 37, 37], 
    [ 59, 1, 2, 25, 27, 29] 
]) 

のように見えます日時オブジェクトのリスト?

+0

あなたもパンダを使用するか、numpyのアレイで純粋に固執する必要がありますか? – Boud

+0

そして、フォローアップの質問 - これは 'datetime.datetime'をラウンドトリップせずに実行でき、' np.datetime64'sの 'np.array'を生成できますか? – Eric

+0

@Boud、パンダがここでどのように助けているか解説してください。 – SDsolar

答えて

3
import datetime 
import numpy as np 

data = np.array(
    [[2015, 2015, 2015, 2015, 2015, 2015], 
    [ 1, 1, 1, 1, 1, 1], 
    [ 1, 1, 1, 2, 2, 2], 
    [ 23, 23, 23, 0, 0, 0], 
    [ 4, 5, 5, 37, 37, 37], 
    [ 59, 1, 2, 25, 27, 29]] 
) 

# Transpose the data so that columns become rows. 
data = data.T 

# A simple list comprehension does the trick, '*' making sure 
# the values are unpacked for 'datetime.datetime'. 
new_data = [datetime.datetime(*x) for x in data] 

print(new_data) 

[datetime.datetimeの(2015、1、1、23、4、59)、datetime.datetimeの(2015年1、 1、23、5、1)、datetime.datetimeの(2015 (2015,1,2,3,25,25)、datetime.datetime(2015、1、 2、0、37、27)、datetime。日時(2015、1、2、0、37、29)]

+0

Upvote。私はdatetime.dateをdatetimeオブジェクトに連結しようとしていました。 (明らかに私は 'datetime import datetime'を使用してコードを読みやすくしています)この方法を知ってうれしいです。私はドキュメントでこれを見たことはありません。 – SDsolar

0

あなたがnp.datetime64オブジェクトをしたい場合、これは動作します:

import functools 

units = 'YMDhms' 
first_vals = np.array([1970, 1, 1, 0, 0, 0]) 
epoch = np.datetime64('1970') 

results = functools.reduce(
    np.add, 
    [ 
     d.astype('timedelta64[{}]'.format(unit)) 
     for d, unit in zip(data - first_vals[:,np.newaxis], units) 
    ], 
    epoch 
) 
与え

array(['2015-01-01T23:04:59', 
     '2015-01-01T23:05:01', 
     '2015-01-01T23:05:02', 
     '2015-01-02T00:37:25', 
     '2015-01-02T00:37:27', 
     '2015-01-02T00:37:29'], dtype='datetime64[s]')