【问题标题】:Get date column from numpy loadtxt()从 numpy loadtxt() 获取日期列
【发布时间】:2017-12-21 05:11:39
【问题描述】:

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

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

我必须做什么才能达到我的要求?

【问题讨论】:

  • A converter 将一个字符串(列)转换为一个值。它不能合并几列(或拆分一列)。您需要在加载后进行转换。

标签: python datetime numpy


【解决方案1】:

我会使用 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)

【讨论】:

    【解决方案2】:

    来自官方docs,转换器的工作原理如下。

    转换器:字典,可选 将列号映射到将该列转换为浮点数的函数的字典。例如,如果第 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多