【问题标题】:How to import csv or txt file where there is no delimiter and commas represent missing values如何导入没有分隔符且逗号表示缺失值的 csv 或 txt 文件
【发布时间】:2019-05-23 09:38:51
【问题描述】:

我正在尝试将 CSV 中的值导入 10 列:有些有数字,有些有逗号,但逗号缺少值,因此没有分隔符:

2000-01-05,,-0.8803936956661669,,,,,,,-0.8316023477879247,

2000-01-06,,,,,,,,,,

2000-01-07,,,,,,,,,-0.3133976053851764,

2000-01-10,-0.26878027549229977,,,,,,,,,

2000-01-11,,,,,,,,1.0787295663966179,,

我尝试了下面的代码,但它删除了左侧的日期列:

data = np.genfromtxt('Book7.txt', invalid_raise = True, usemask = False)
datanew = data[:,~np.all(np.isnan(data), axis = 0)]

【问题讨论】:

  • genfromtxt 起作用的事实表明逗号确实是分隔符。连续的逗号之间只是缺少数据。 genfromtxt 使用 nan 作为填充值。它还在第一列中使用nan,它无法将其转换为浮点数。
  • 你想对第一列做什么?它看起来像日期,但不适合浮点数组。您的最后一行代码删除了所有 nan 的列

标签: python csv numpy delimiter


【解决方案1】:

我不知道您希望丢失的数据是什么,但此代码将日期列转换为 datetime.date,同时将缺失值设置为 NaN。

import numpy as np
import datetime

def convert_iso_string_to_date(s):
    year, month, day = (int(x) for x in s.decode("ascii").split("-"))
    return datetime.date(year, month, day)

data = np.genfromtxt("test.txt", delimiter=",", converters={0: convert_iso_string_to_date}, invalid_raise=True, usemask=False)
print(data)
[(datetime.date(2000, 1, 5),         nan, -0.8803937, nan, nan, nan, nan, nan,        nan, -0.83160235, nan)
 (datetime.date(2000, 1, 6),         nan,        nan, nan, nan, nan, nan, nan,        nan,         nan, nan)
 (datetime.date(2000, 1, 7),         nan,        nan, nan, nan, nan, nan, nan,        nan, -0.31339761, nan)
 (datetime.date(2000, 1, 10), -0.26878028,        nan, nan, nan, nan, nan, nan,        nan,         nan, nan)
 (datetime.date(2000, 1, 11),         nan,        nan, nan, nan, nan, nan, nan, 1.07872957,         nan, nan)]

【讨论】:

    【解决方案2】:

    不确定 numpy 是首选还是强制。 pandas 无需额外代码即可做到这一点:

    import io
    import pandas as pd
    
    text = """2000-01-05,,-0.8803936956661669,,,,,,,-0.8316023477879247,
    
    2000-01-06,,,,,,,,,,
    
    2000-01-07,,,,,,,,,-0.3133976053851764,
    
    2000-01-10,-0.26878027549229977,,,,,,,,,
    
    2000-01-11,,,,,,,,1.0787295663966179,,"""
    
    csv = io.StringIO(text)
    
    df = pd.DataFrame([cell.split(',') for cell in csv])
    
    print(df)
    

    输出:

               0                     1   ...                   9     10
    0  2000-01-05                        ...  -0.8316023477879247    \n
    1          \n                  None  ...                 None  None
    2  2000-01-06                        ...                         \n
    3          \n                  None  ...                 None  None
    4  2000-01-07                        ...  -0.3133976053851764    \n
    5          \n                  None  ...                 None  None
    6  2000-01-10  -0.26878027549229977  ...                         \n
    7          \n                  None  ...                 None  None
    8  2000-01-11                        ...                           
    
    [9 rows x 11 columns]
    

    您可能希望删除空行。

    【讨论】:

      【解决方案3】:

      你可以简单地使用python内置函数:

      from numpy import array
      
      with open('Book7.txt') as file:
          data = file.readlines()
      
      matrix = []
      for line in data:
          if line != '\n':
              matrix.append(line.split(',')[0:10])
      matrix = array(matrix)
      

      【讨论】:

        猜你喜欢
        • 2020-11-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多