pandas - 在线性时间内执行 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)
我的问题是上面显示的操作是在线性时间内运行的,即随着文件大小的增加,提取信息并获取该数据帧所花费的时间更多。
我怎样才能使它更有效率?
解决方案
您可以在此处使用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
后处理当然是可选的,但我不认为应该减慢速度。
推荐阅读
- primefaces - 是否可以更改 primefaces 日历导航器下拉列表中的月份标签
- php - 使用内联 PHP 将 HTML 转换为 PDF
- c++ - 实例化模板参数的参数包
- php - 我想通过使用 MySQL XAMPP 的 SQL 查询获取 100,000 条记录并保存在一个数组中,但它甚至不获取 16,000 条并暂停或显示
- python - 拉丁字母的 PySpark DF 和 RDD 编码
- python - 如何消除丢失的数据
- css - JavaFX CSS 中的 -fx-padding 和 -fx-label-padding 有什么区别?
- mongodb - 将本地服务器添加到 MongoDB Atlas 云实例
- sql - 使用唯一数据更新的非键保留表错误
- ios - 如何将框架添加到 Swift 项目中?