2017-07-16 230 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]