【问题标题】:Perform csv sanitisation in linear time在线性时间内执行 csv 清理
【发布时间】:2020-12-08 04:52:53
【问题描述】:

我正在使用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"
...
...

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

我想出了以下代码来清理数据并将其导出为 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)

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

如何提高效率?

【问题讨论】:

  • @anon01 数据通过设备随附的软件存储/记录到 csv 文件中。但是,我正在尝试提高之后发生的事情的效率,即从原始文件中修剪、拆分和重新形成另一个 df。我们不要考虑read 瓶颈。就性能而言,上述功能可以做得更好吗?肯定会分析代码

标签: pandas performance file-io big-o python-3.7


【解决方案1】:

您可以在此处使用pd.read_csv 代替DataFrame 构造函数。有很多选项(包括 encodingengine quotechar 可能会有所帮助)。至少 pandas 会为您完成所有解析,并且可能具有更好的性能(尤其是设置 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

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

【讨论】:

  • 我确实使用了read_csv 方法并得到了如上所示的输出,再次是线性时间 O(n)。只是想知道它是否可以更好。不过感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2014-05-29
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多