从numpy loadtxt()获取日期列

时间:2017-07-16 16:53:21

标签: python datetime numpy

我有一个包含下表的文本文件。

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})

我需要做些什么才能达到我的要求?

2 个答案:

答案 0 :(得分:3)

我将Pandas模块用于此任务:

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)

答案 1 :(得分:2)

从官方docs开始,转换器的工作原理如下。

  

转换器:dict,可选   将列号映射到将该列转换为float的函数的字典。例如,如果第0列是日期字符串:converters = {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]