【问题标题】:numpy data slicing with mixed type混合类型的numpy数据切片
【发布时间】:2017-06-21 08:42:34
【问题描述】:

我使用 numpy.genfromtxt 从一个 csv 文件中加载数据,这个文件有混合数据类型,如下所示:

date,value1,value2
1997-02, 432, 1
1997-03, 300, 1
1997-04, 432, 0

我使用以下命令加载数据:

data = numpy.genfromtxt('data/test.csv', dtype=None, delimiter=',', skip_header=1)

我得到了

array([(b'1997-02', 432, 1), (b'1997-03', 300, 1), (b'1997-04', 432, 0)], 
      dtype=[('f0', 'S7'), ('f1', '<i8'), ('f2', '<i8')])

现在我只想要这些数据的日期,我怎样才能对混合类型的 numpy 数组进行切片?我尝试使用 data[:,0] 但它不起作用

【问题讨论】:

    标签: python csv numpy


    【解决方案1】:

    你可以使用字段名:

    data['f0']
    
    # array([b'1997-02', b'1997-03', b'1997-04'], 
    #       dtype='|S7')
    

    为了您的阅读目的,我认为您希望指定names = True 而不是skip_header,以便第一行将作为结构化数组的字段名称读入:

    data = np.genfromtxt('data/test.csv', dtype=None, delimiter=',', names = True)
    ​    
    data
    # array([(b'1997-02', 432, 1), (b'1997-03', 300, 1), (b'1997-04', 432, 0)], 
    #       dtype=[('date', 'S7'), ('value1', '<i8'), ('value2', '<i8')])
    

    现在您可以通过以下方式访问date

    data['date']
    # array([b'1997-02', b'1997-03', b'1997-04'], 
    #       dtype='|S7')
    

    【讨论】:

      【解决方案2】:

      dtype=None 它推导出字段 dtypes,在这种情况下,一个字符串,其余的整数。您可以使用 np.datetime64 定义(“M”表示月份)来优化 dtype

      In [419]: dt = ['datetime64[M]', 'i', 'i']
      In [420]: data=np.genfromtxt(txt.splitlines(), delimiter=',',names=True, dtype=dt)
      In [421]: data
      Out[421]: 
      array([('1997-02', 432, 1), 
             ('1997-03', 300, 1), 
             ('1997-04', 432, 0)], 
            dtype=[('date', '<M8[M]'), ('value1', '<i4'), ('value2', '<i4')])
      

      这是一个形状为 (3,) 的一维结构化数组。它没有命名为fields 的列,而是通过名称而不是索引来访问的。

      In [422]: data['date']
      Out[422]: array(['1997-02', '1997-03', '1997-04'], dtype='datetime64[M]')
      

      如果您更愿意使用字符串,请坚持使用默认值。但是将日期时间对象转换为事物很容易

      天:

      In [424]: data['date'].astype('datetime64[D]')
      Out[424]: array(['1997-02-01', '1997-03-01', '1997-04-01'], dtype='datetime64[D]')
      

      字符串

      In [427]: data['date'].astype('U7')
      Out[427]: 
      array(['1997-02', '1997-03', '1997-04'], 
            dtype='<U7')
      

      datetime对象:

      In [428]: data['date'].tolist()
      Out[428]: 
      [datetime.date(1997, 2, 1),
       datetime.date(1997, 3, 1),
       datetime.date(1997, 4, 1)]
      

      整数:

      In [429]: data['date'].astype(int)
      Out[429]: array([325, 326, 327])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-27
        • 2020-08-04
        • 2017-08-12
        • 1970-01-01
        相关资源
        最近更新 更多