运行环境
笔记本win10,i5-6200U,16G
python3.8
pandas1.3.5
程序目的
在一张接近45M的csv表格,63.7w行数据,从中提取符合时间段范围的(每天20到第二天9点的数据),并且信号数值小于一定范围的数据,接着按每天为一份,去重统计和提取这些数据的原始详细信息

最原始的运算方式,一行一行遍历去判断每个单元格
def date_clean(file: str, time_interval: tuple, distance: tuple):
"""
按时间区间,信号范围来提取出数据
:param file: 读取csv文件
:param time_interval: 开始小时和结束小时,元组类型(20,9)20点到9点
:param distance: 开始结束信号,元组类型(500,30000) 500到30000
:return:
"""
df_list = [] # 存储筛选好的数据,先存列表或字典,最后再转为DataFrame能缩短一半时间
print(f"loading... {
datetime.datetime.now()}")
data_frame = pd.read_csv(file, encoding='utf-8', dtype="string[pyarrow]") # 防止读取长数值时,用的是科学计数法导致精度丢失
print(f"加载完毕... {
datetime.datetime.now()}")
start_time = datetime.time(time_interval[0], 0, 0)
end_time = datetime.time(time_interval[1], 0, 0)
if time_interval[0] > time_interval[1]: # 如果时间区间是跨天
for ind, row in data_frame.iterrows():
if (datetime.time(time_interval[0], 0, 0) <= pd.to_datetime(row["采集时间"]).time() or
pd.to_datetime(row["采集时间"]).time() <= datetime.time(time_interval[1], 0, 0)): # 只比较小时:
if distance[0] <= int(float(row["信号"])) <= distance[1]:
#print(data_frame.loc[[row]])
#print(row)
df_list.append(row.to_list())
else:
pass
df = data_frame.reset_index(drop=True)
#df = pd.DataFrame(df_list, columns=["数据", "地点", "采集时间", "归属地", "信号"]) # to_list()后没有了表头,需要手动添加
# .reset_index()列表里存的是Series,他还有一组与数组数据对应的标签索引。转为DataFrame后需要重设index
#print(df)
print(f"依据时间和信号值过滤的数据比为 {
len(df)}/{
len(data_frame)}")
print(

文章讲述了作者如何优化Python代码,使用Pandas处理一个45M的大CSV文件,提升从特定时间段和信号范围内提取数据的效率,从最初的900s降低到30s,主要改进了数据遍历和筛选过程。
最低0.47元/天 解锁文章
391

被折叠的 条评论
为什么被折叠?



