![](/img/trans.png)
[英]Python: Elegantly print all *remaining* elements from list in one line
[英]First row from a CSV file is a list of one string while the remaining rows are list of elements in Python
我是新手,正在尝试使用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模块执行此操作。
我建议您使用pandas
而不是csv
因为它能够读取和创建电子表格。 每个文件的第一行通常用于命名列。 由于每一列都有一个唯一的名称,因此您无需知道位置,因为在熊猫中,可以按名称访问列。
import pandas as pd
data = pd.read_csv(yourFilePath, sep = ';', index_col = 0, parse_dates = True)
这将创建一个类似于MS Excel的电子表格。 第一列“ createTime”将是电子表格的索引,而熊猫会尝试将此列中的字符串解析为日期/时间信息。
如果您现在想做一些数学运算,则可以逐列进行,因为pandas
能够正确地解释这一点。 对于选择行,您可以按标签使用选择:
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':]
您还可以根据索引对齐数据框。 这是一个类似的例子
aligned_data = data1.join(data2, how = 'outer', rsuffic = '_2')
还有多种功能可让您计算列的描述,例如平均值,标准偏差等。例如,“ Grid kW”列的静态值:
data['Grid kW'].describe()
最后,您可以对完整的数据框进行数学运算。 熊猫会自动使用正确的列。 如果其中一个数据帧中缺少专用列,则计算结果将为“ nan”。 对于缺失值,同样有效。 因此,数据帧之间的计算结果将始终导致仅具有有效数据的数据帧。
data1.loc['20140922'] + data2.loc['20140922']
那应该涵盖您的意图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.