【问题标题】:Converting .csv file to usable dataframe in python在python中将.csv文件转换为可用的数据框
【发布时间】:2021-05-28 09:22:23
【问题描述】:

我有一个格式很糟糕的 .csv 文件。它只是具有多个时间序列的单列。我想根据部分字符串将该列拆分为多个列,但我不确定从哪里开始。数据如下:

tagname1 
Time stamp:;Value:;Quality:;

2-5-2021 23:55:31;95.80;0x400c0
3-5-2021 00:06:48;95.80;0x400c0
....etc

tagname2 
Time stamp:;Value:;Quality:;

2-5-2021 23:55:31;97.80;0x400c0
3-5-2021 00:06:48;98.80;0x400c0
....etc


tagname3 
Time stamp:;Value:;Quality:;

2-5-2021 23:55:31;92.80;0x400c0
3-5-2021 00:06:48;93.80;0x400c0
....etc
    

所有这些数据只是一列,并且希望根据标记名将它们拆分。标记名始终以相同的部分字符串开头。 拆分此列后,需要根据分隔符“;”再次拆分数据,但这应该相对简单。

任何帮助将不胜感激!

【问题讨论】:

  • 您编写了什么代码来纠正 csv 的不良状态? minimal reproducible example 你们中的哪些人将其分解并更好地格式化?你的代码有什么问题?你的问题在哪里?目前,这看起来像是一个“我需要 X - 为我编写代码”的任务,这在此处是题外话。
  • 最简单的方法可能是逐行读取错误的 csv,每当您看到“标记名”('tagname_Nr{nr}.csv')时创建一个新的输出文件并将所有行写入该 csv 直到您到达下一个标记名。重复直到完成。这样你就可以拥有 N 个 csv 文件,其中包含属于一个标签的时间序列。然后,您可以将它们读入 N 个单独的数据帧,您可以随意使用。

标签: python string csv split partial


【解决方案1】:

.csv 文件是否有一些您可以遵循的模式? 我能想到的最好方法是使用 pandas.read_csv(filepath) 然后使用 DataFrame().iterrows 将文件解析为对您更有意义的内容(也许如果您知道标签之间的行数,甚至当“tagnamex”行出现时打破它

newDF = pandas.read_csv(filepath)
for row in newDF.iterrows():
    if "tagname" in row[1]:
        #start saving rows in some new array

这样做之后,您可以使用 pandas 来根据自己的喜好重构数据框

【讨论】:

    【解决方案2】:

    使用以下 csv :

    tagname1 
    Time stamp:;Value:;Quality:;
    
    2-5-2021 23:55:31;95.80;0x400c0
    3-5-2021 00:06:48;95.80;0x400c0
    
    tagname2 
    Time stamp:;Value:;Quality:;
    
    2-5-2021 23:55:31;97.80;0x400c0
    3-5-2021 00:06:48;98.80;0x400c0
    
    
    tagname3 
    Time stamp:;Value:;Quality:;
    
    2-5-2021 23:55:31;92.80;0x400c0
    3-5-2021 00:06:48;93.80;0x400c0
    

    您可以编写以下代码来创建字典:

    from datetime import datetime
    
    dict_data = {}
    with open('data.csv') as f:
        lines = f.read().splitlines()
    
        for line in lines :
            if line.startswith('tagname'):
                tagname = line.strip()
                dict_data[tagname] = []
            else :
                try :
                    int(line[0])
                except ValueError:
                    pass
                except IndexError:
                    pass
                else :
                    dict_data[tagname].append(line.split(";"))
                    #Formating
                    dict_data[tagname][-1][0] = datetime.strptime(dict_data[tagname][-1][0], '%d-%m-%Y %H:%M:%S')
                    dict_data[tagname][-1][1] = float(dict_data[tagname][-1][1])
    
    print(dict_data['tagname1'])
    # return [[datetime.datetime(2021, 5, 2, 23, 55, 31), 95.8, '0x400c0'], [datetime.datetime(2021, 5, 3, 0, 6, 48), 95.8, '0x400c0']]
    

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 2016-02-18
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多