【问题标题】:First row from a CSV file is a list of one string while the remaining rows are list of elements in PythonCSV 文件的第一行是一个字符串的列表,而其余行是 Python 中的元素列表
【发布时间】:2015-08-15 17:45:45
【问题描述】:

我是一个新手,正在尝试使用 Python 3 执行一些计算并分析来自大量 CSV 文件的一些数据。每个 CSV 文件的数据存储在大约 30000 行中,以分号分隔。由于这些是系统生成的文件,因此第一行的每个文件的参数名称以不同的顺序排列。所以我想提取这些参数名称,比较它们并找出每个文件所需参数值的位置。

但在我这样做之前,当我读取 CSV 文件的第一行时,列表有一个由“;”分隔的字符串而其余的行被正确提取。我尝试过拆分文本和其他方式,但它们都对输出没有任何影响。有人可以帮助解决这个问题。

这是我写的一段代码:

import os 
import sys
import csv
import math      
# Open a file
full_path = "C:\\Documents and Settings\\My Documents\\CSV files"
dirs = os.listdir( full_path )
filename = list()

"""This will find the file in the directory and print the first row of the 
CSV file - the names of the parameters."""
for file in dirs:
    path = full_path+'\\'+file
    with open(path, 'rt') as csvfile:
        #For printing the location name   
        Turbine_name = (os.path.splitext(file)[0])
        #Reading the files into an object
        csvreader = csv.reader(csvfile, delimiter=';')
        #Obtaining the first line of the CSV file - the names of the parameters
        Parameters = next(csvreader)
        print (Parameters)
        #From this line, the values of different Parameters are extracted
        for row in csvreader:
            Parameters = next(csvreader)
            print (Parameters)
            #To eliminate rows with insufficient data
            if len(Parameters)>11:            
                Created_time = Parameters[0]
                Grid_frequency = float(Parameters[3])
                Grid_KW = float(Parameters[4])
                Rotor_RPM = float(Parameters[10])

这里以参数的位置为例,因为我还没有编写用于比较字符串的代码。输入文件的示例如下所示:

createTime;"Grid CosPhi";"Grid Current";"Grid Frequency";"Grid kW";"Grid   VAr";"Grid Voltage";"Pitch angle 1";"Pitch angle 2";"Pitch angle 3";"Rotor RPM";"Temp.  5    214";"Temp.  6    217";"Temp.  9    227";"Winddirection";"Windspeed"
9/21/14 11:30:01 PM;N/A;N/A;49.963;211688.734;N/A;N/A;-1.06;-1.039;-1.119;19.379;47.167;36;64;N/A;6.319
9/21/14 11:40:01 PM;N/A;N/A;50.002;170096.297;N/A;N/A;-1.003;-0.96;-1.058;19.446;47.182;36.084;63.772;N/A;5.628
9/21/14 11:50:01 PM;N/A;N/A;50.021;175038.734;N/A;N/A;-0.976;-0.961;-1.082;18.805;47;36.223;63.153;N/A;5.577
9/22/14 12:00:01 AM;N/A;N/A;49.964;229942.016;N/A;N/A;-1.047;-1.018;-1.066;18.957;47.125;36.293;63.766;N/A;6.431
9/22/14 12:10:01 AM;N/A;N/A;49.908;200873.844;N/A;N/A;-0.997;-0.985;-1.06;19.229;47.028;36.334;63.962;N/A;6.076
9/22/14 12:20:01 AM;N/A;N/A;49.934;234467.609;N/A;N/A;-1.028;-0.986;-1.001;18.995;47.056;36.401;63.732;N/A;6.067
9/22/14 12:30:01 AM;N/A;N/A;49.96;270969.25;N/A;N/A;-1.138;-1.103;-1.122;18.983;47.274;36.499;64.014;N/A;6.487
9/23/14 12:30:01 PM;N/A;N/A;50.073;54458.719;N/A;N/A;-0.492;-0.52;-0.472;13;42.02;33.624;46.426;N/A;3.757

当我得到输出时,它看起来像这样:

>>>['createTime;"Grid CosPhi";"Grid Current";"Grid Frequency";"Grid kW";"Grid VAr";"Grid Voltage";"Pitch angle 1";"Pitch angle 2";"Pitch angle 3";"Rotor RPM";"Temp.  5    214";"Temp.  6    217";"Temp.  9    227";"Winddirection";"Windspeed"']
   ['9/21/14 11:40:01 PM', 'N/A', 'N/A', '50.002', '170096.297', 'N/A', 'N/A', '-1.003', '-0.96', '-1.058', '19.446', '47.182', '36.084', '63.772', 'N/A', '5.628']
   ['9/22/14 12:00:01 AM', 'N/A', 'N/A', '49.964', '229942.016', 'N/A', 'N/A', '-1.047', '-1.018', '-1.066', '18.957', '47.125', '36.293', '63.766', 'N/A', '6.431']
   ['9/22/14 12:20:01 AM', 'N/A', 'N/A', '49.934', '234467.609', 'N/A', 'N/A', '-1.028', '-0.986', '-1.001', '18.995', '47.056', '36.401', '63.732', 'N/A', '6.067']

正如在某些文件中所观察到的,某些参数完全丢失。这就是为什么我需要找出每个 CSV 文件中各个参数的位置。任何如何才能做到最好的想法也值得赞赏。提前致谢。

编辑:不幸的是,我不能使用 Pandas,因为它必须单独安装在 Python34 中,而且我的办公系统(Windows XP、P4)不支持它。如果可能的话,我想用 CSV 模块来做这件事。

【问题讨论】:

    标签: python string list


    【解决方案1】:

    我建议您使用pandas 而不是csv,因为它更能读取和创建电子表格。每个文件的第一行通常用于命名列。由于每列都有一个唯一的名称,因此您无需知道位置,因为在 pandas 中,列可以通过名称访问。

    import pandas as pd
    data = pd.read_csv(yourFilePath, sep = ';', index_col = 0, parse_dates = True)
    

    这将创建一个类似于 MS Excel 的电子表格。第一列“createTime”将是电子表格的索引,pandas 将尝试将此列中的字符串解析为日期/时间信息。

    如果您现在喜欢做一些数学运算,您可以逐列进行,因为pandas 能够正确解释。对于选择行,您可以使用 labels 选择:

    import pandas as pd
    data1 = pd.read_csv(yourFilePath1, sep = ';', index_col = 0, parse_dates = True)
    data2 = pd.read_csv(yourFilePath2, sep = ';', index_col = 0, parse_dates = True)
    #select a specific time range only, e.g 22th Sept. 2014
    range_of_interest = data.loc['20140922']
    #select time range >= Sept. 22th, 2014
    range_of_interest = data.loc['20140922':]
    

    您还可以根据索引对齐数据框。这是一个类似的example

    aligned_data = data1.join(data2, how = 'outer', rsuffic = '_2')
    

    还有多个函数可让您计算列的描述,如平均值、标准差等。例如,列“Grid kW”的统计值:

    data['Grid kW'].describe()
    

    最后,您可以使用完整的数据框进行数学运算。 pandas 将自动使用正确的列。如果其中一个数据框中缺少特定列,则计算结果将为“nan”。同样适用于缺失值。所以数据帧之间的计算结果总是会产生一个只有有效数据的数据帧。

    data1.loc['20140922'] + data2.loc['20140922']
    

    这应该涵盖你的意图。

    【讨论】:

    • 嗨@RaJa... 目前在我的办公室计算机上,我没有 Pandas 模块。我现在正在下载它,但在这种情况下是否可以使用文本文件执行相同的操作?因为系统会生成文本文件,我将它们转换为 CSV……再次感谢。
    • 是的,当然。只要您的列有唯一的分隔符,pandas 就可以读取多种格式,甚至是纯文本文件。在您的情况下,空格会很困难,因为它已经是您创建日期的一部分。
    • 此外,我不想混淆来自两个不同文件的数据......甚至来自两个不同的行。是否可以使用 Pandas 逐行读取数据,因为我需要使用参数为特定时间戳进行计算……就像在同一行数据中一样。到目前为止,我还没有找到相关的文档。
    • 我在上面编辑了我的答案以允许选择特定的时间戳。
    • 非常感谢您的编辑,但我想我无法清楚地解释问题。非常清楚,我想仅使用单个 CSV 文件的每一行中的几个参数来计算单个滑动值。如您所见,单个时间戳包括日期和时间。但我不想选择时间戳。我想计算所有行。这就是为什么我要求一个循环或其他东西来迭代行,就像 CSV 模块中的 next() 那样。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多