2017-07-16 61 views
1

我有一個文本文件,其中包含下表。從numpy獲取日期colomn loadtxt()

Day Month Year Avg Power 
01  01 2000 30 
02  01 2000 41 
04  01 2000 55 
05  01 2000 78 
06  01 2000 134 
07  01 2000 42 

我想將日,月和年的列加載到單個日期時間值。要做到這一點,遵循以下步驟。但是這些代碼並不符合我的預期。

from numpy import loadtxt 
import datetime 

def date_converter(x,y,z): 
    date = "{},{},{}".format(x,y,z) 
    return datetime.datetime.strptime(date,r"%d,%m,%Y") 

data3 = loadtxt('complex_data_file.txt',dtype=int, usecols=(0,1,2,4), 
       converters={(0,1,2):date_converter,3:int}) 

我需要做些什麼來實現我的要求?

+1

'converter'將一個字符串(列)轉換爲一個值。它不能合併多個列(或分割一列)。加載後您需要進行轉換。 – hpaulj

回答

3

我會用熊貓模塊完成這個任務:

In [228]: df = pd.read_csv(fn, usecols=[0,1,2,4], parse_dates={'Date':[2,1,0]}) 

In [229]: df 
Out[229]: 
     Date Avg Power 
0 2000-01-01   30 
1 2000-01-02   41 
2 2000-01-04   55 
3 2000-01-05   78 
4 2000-01-06  134 
5 2000-01-07   42 

In [230]: df.dtypes 
Out[230]: 
Date   datetime64[ns] 
Avg Power    int64 
dtype: object 

它也很容易將它轉換爲numpy的數組:

In [231]: df.values 
Out[231]: 
array([[Timestamp('2000-01-01 00:00:00'), 30], 
     [Timestamp('2000-01-02 00:00:00'), 41], 
     [Timestamp('2000-01-04 00:00:00'), 55], 
     [Timestamp('2000-01-05 00:00:00'), 78], 
     [Timestamp('2000-01-06 00:00:00'), 134], 
     [Timestamp('2000-01-07 00:00:00'), 42]], dtype=object) 
2

從官方docs,轉換器工作如下。

轉換器:字典,可選 字典將列號映射到將該列轉換爲浮點型的函數。例如,如果列0是日期字符串:轉換器= {0:datestr2num}。默認值:無。

所以,轉換器不能處理幾列。加載後您需要進行轉換。你可以做這樣的事情。

from numpy import loadtxt 
import datetime 

def date_converter(x,y,z): 
    date = "{},{},{}".format(x,y,z) 
    return datetime.datetime.strptime(date,r"%d,%m,%Y") 

data3 = loadtxt('file.txt',dtype=int, usecols=(0,1,2,3)) 
converted_data3 = [[date_converter(row[0], row[1], row[2]), row[3]] for row in data3] 
for item in converted_data3: 
    print(item) 

輸出:

[datetime.datetime(2000, 1, 1, 0, 0), 30] 
[datetime.datetime(2000, 1, 2, 0, 0), 41] 
[datetime.datetime(2000, 1, 4, 0, 0), 55] 
[datetime.datetime(2000, 1, 5, 0, 0), 78] 
[datetime.datetime(2000, 1, 6, 0, 0), 134] 
[datetime.datetime(2000, 1, 7, 0, 0), 42]