首页 > 解决方案 > 在线性时间内执行 csv 清理

问题描述

我正在使用HTC风速计,它按以下顺序为我提供数据,其中两列合并为一列,并且有一些我想排除的无用数据。数据如下所示

"NO.","T&RH","DATA","UNIT","TIME"
1," 27�C 70.5%",0,"m/s","30-11-2020\15:33:34"
2," 27�C 70.5%",0,"m/s","30-11-2020\15:33:35"
3," 27�C 70.5%",0,"m/s","30-11-2020\15:33:36"
4," 27�C 70.5%",0,"m/s","30-11-2020\15:33:37"
...
...

当我尝试将其加载到熊猫数据框中时,会出现各种奇怪的错误。

我想出了以下代码来清理数据并将其导出为 df。

import pandas as pd
def _formathtc(text_data:list) ->pd.DataFrame:
  data = []
  for l in rawdata:
    d = []
    l = l.split(",")
    try:
      _,t,h = l[1].strip('"').split(" ")
      d.append(t.replace("°C","")) 
      d.append(h.replace("%",""))
      d.append(l[2])
      d.append(l[-1].strip('\n'))
      data.append(d)
    except Exception as e:
      pass
  df = pd.DataFrame(data=data)
  df.columns=['temp','relhum','data','time']
  return df

def gethtc(filename:str)->pd.DataFrame:
  text_data = open(filename, "r", encoding="iso-8859-1").readlines()
  return _formathtc(text_data)

df = gethtc(somefilename)

我的问题是上面显示的操作是在线性时间内运行的,即随着文件大小的增加,提取信息并获取该数据帧所花费的时间更多。

我怎样才能使它更有效率?

标签: pandasperformancefile-iobig-opython-3.7

解决方案


您可以在此处使用pd.read_csv代替DataFrame构造函数。有很多选项(包括encoding, 并且engine quotechar可能会有所帮助)。至少 pandas 会为您完成所有解析,并且可能具有更好的性能(尤其是 setting engine="c")。如果这对性能没有帮助,我不确定是否有更好的原生 pandas 选项:

df = pd.read_csv("htc.csv", engine="c")
df["TIME"] = pd.to_datetime(df.TIME.str.replace("\\", " "))
df["T&RH"] = df['T&RH'].str.replace("�", "")

输出:

   NO.        T&RH  DATA UNIT                TIME
0    1   27C 70.5%     0  m/s 2020-11-30 15:33:34
1    2   27C 70.5%     0  m/s 2020-11-30 15:33:35
2    3   27C 70.5%     0  m/s 2020-11-30 15:33:36
3    4   27C 70.5%     0  m/s 2020-11-30 15:33:37

后处理当然是可选的,但我不认为应该减慢速度。


推荐阅读