python 数据分析性能优化,双层for循环优化为单个for循环

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import openpyxl
import pandas as pd
from openpyxl import load_workbook
import datetime
import time

def addTimeToList(array, i, time):
    #array[i] = time # 在列表中增加一个空列表
    array.append(time)

def getSrcTimeList(sourceFile1):
    data = pd.read_csv(sourceFile1, low_memory=False)  # 读取A0这个表里的date和close列
    nrows = data.shape[0]  # 表格的行数
    ncols = data.columns.size  # 表格包含列数
    pressureList = data['通道号']  # 保存通道号这列数据,压力值列
    srcTimeValue = data['单号']  # 保存单号这列数据,源数据时间
    for time1 in srcTimeValue:
        global srcTimeArray, srcRowNum
        # 获取src表格的时间信息
        srcTime = str(time1)
        year = 0
        month = 0
        date = 0
        hour = 0
        minute = 0
        second = 0
        if srcTime.find(':') == -1 or srcTime.find('/') == -1:
            addTimeToList(srcTimeArray, srcRowNum, str(year)+str(month)+str(date)+str(hour)+str(minute)+str(second))
            srcRowNum = srcRowNum + 1
            continue
        srcTimeList = srcTime.split()
        srcYMDtime = srcTimeList[0].split(r'/')
        srcHMStime = srcTimeList[1].split(r':')
        year = int(srcYMDtime[0])
        month = int(srcYMDtime[1])
        date = int(srcYMDtime[2])
        hour = int(srcHMStime[0])
        minute = int(srcHMStime[1])
        second = int(float(srcHMStime[2]))
        addTimeToList(srcTimeArray, srcRowNum,
                      str(year) + str(month) + str(date) + str(hour) + str(minute) + str(second))
        srcRowNum = srcRowNum + 1

def getDstTimeList(dstFile):
    # 读取目标文件
    dstSheetName = '记录层'
    dst_data = pd.read_excel(dstFile, dstSheetName)
    newDstColNum = dst_data.shape[1] + 1
    dstTimeValue = dst_data['绝对时间']  # 保存单号这列数据,源数据时间
    for time1 in dstTimeValue:
        global dstTimeArray, dstRowNum
        # 获取src表格的时间信息
        dstTime = str(time1)
        year = 0
        month = 0
        date = 0
        hour = 0
        minute = 0
        second = 0
        if dstTime.find(':') == -1 or dstTime.find('-') == -1:
            addTimeToList(dstTimeArray, dstRowNum, str(year)+str(month)+str(date)+str(hour)+str(minute)+str(second))
            dstRowNum = dstRowNum + 1
            continue
        dsTimeList = dstTime.split()
        dstYMDtime = dsTimeList[0].split(r'-')
        dstHMStime = dsTimeList[1].split(r':')
        year = int(dstYMDtime[0])
        month = int(dstYMDtime[1])
        date = int(dstYMDtime[2])
        hour = int(dstHMStime[0])
        minute = int(dstHMStime[1])
        second = int(float(dstHMStime[2]))
        addTimeToList(dstTimeArray, dstRowNum,
                      str(year) + str(month) + str(date) + str(hour) + str(minute) + str(second))
        dstRowNum = dstRowNum + 1

def mainProcess(dstFile, sourceFile, srcArray, dstArray):
    # 读取源表格
    data = pd.read_csv(sourceFile, low_memory=False)  # 读取A0这个表里的date和close列
    nrows = data.shape[0]  # 表格的行数
    print(nrows)  # 总计68560行
    ncols = data.columns.size  # 表格包含列数
    pressureList = data['通道号']  # 保存通道号这列数据,压力值列
    srcTimeValue = data['单号']  # 保存单号这列数据,源数据时间

    # 读取目标文件
    dstSheetName = '记录层'
    dst_data = pd.read_excel(dstFile, dstSheetName)
    #print(dst_data.shape[1])
    newDstColNum = dst_data.shape[1] + 1
    dstTimeValue = dst_data['绝对时间']  # 保存单号这列数据,源数据时间
    # 写入文件位置
    book = load_workbook(dstFile)  # 打开文件准备向里面写入数据
    sh1 = book[dstSheetName]
    print(sh1.cell(1, 1).value)  # 安坐标读取excel表格的值
    sh1.cell(1, newDstColNum).value = '压力'  # 向表格中新增加一列,
    pos = 0
    global dstRowNum, srcRowNum
    for d in range(dstRowNum):
        print(d)
        if dstTimeArray[d] in srcTimeArray:
            s = srcTimeArray.index(dstTimeArray[d])
            sh1.cell(d + 1 + 1, newDstColNum).value = str(pressureList[s])
        else:
            continue
        #srcRowNum = 0 # src表格从头开始读取
        # for s in range(srcRowNum):
        #     if (dstArray[d][1] == srcArray[s][1] and dstArray[d][2] == srcArray[s][2]):
        #         if(dstArray[d][3] == srcArray[s][3] and dstArray[d][4] == srcArray[s][4] and dstArray[d][5] == srcArray[s][5]):
        #             sh1.cell(d + 1+1,newDstColNum).value = str(pressureList[s])
        #             break    # 执行下一个循环
    book.save(dstFile)  # 保存表格,耗时较长

if __name__ == '__main__':
    # 获取dst时间列表
    start = time.perf_counter()
    sourceFile1 = r"E:\gaoyi\source.csv"
    srcRowNum = 0
    srcTimeArray = [] # 存放src时间
    getSrcTimeList(sourceFile1)
    #print(srcRowNum)

    # 获取dst时间列表,   # 程序运行期间,dst表格需要关闭(需要写入),src表格只读可以打开
    dstFile1 = r"E:\gaoyi\dest.xlsx"
    dstSheetName = '记录层'
    dstTimeArray = []
    dstRowNum = 0
    getDstTimeList(dstFile1)
    mainProcess(dstFile1, sourceFile1, srcTimeArray, dstTimeArray)

    end = time.perf_counter()
    print("final is in ", end - start) # 程序运行时间

核心思想:使用list的index函数查找目标字符串位置。

对python不熟悉,使用C语言方式写python程序。python一些好用的库函数需要继续发掘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值