DataFrame,数据列筛选代替遍历每一行数据去判断,大大提高数据过滤速度

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

运行环境

笔记本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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值