首页 > 其他分享 >使用Pandas和NumPy实现数据获取

使用Pandas和NumPy实现数据获取

时间:2024-08-12 12:38:22浏览次数:10  
标签:arr target 数据 获取 file csv NumPy Pandas out

公众号本文地址:https://mp.weixin.qq.com/s/Uc4sUwhjLTpOo85ubj0-QA

以某城市地铁数据为例,通过提取每个站三个月15分钟粒度的上下客量数据,展示Pandas和Numpy的案例应用。

数据:http://u6v.cn/5W2i8H

http://u6v.cn/6hUVjk

image

初步发现数据有三个特点::1、地铁数据的前五行是无效的,第七行给出了每个站点的名字;2、每个车站是按照15分钟粒度统计客流,给出了进站、出战、进出站客流;3、运营时间是从2:00-23:59,与地铁实际运营时间5:30-23:00不同,需要调整。

# 导入模块
import os 
from pathlib import Path
import pandas as pd
import numpy as np

导入成功后,先获取目标文件夹下(data)的文件名,存入filenames变量中。

# 获取文件名
path = "./data"
filenames = os.listdir(path)
filenames

获取每个车站所对应的列号,确定pdd.read_excel(usecols)中usecols的参数

# 筛选掉 “合计”无用项,并设置target_col存储目标项
name = filenames[0]
f = "./data/" + name
# 前五行是无用数据
file = pd.read_excel(f, skiprows = 5, skipfooter = 3)
tarr = file.values
print(tarr[3])
test = tarr[0]
target_col = []
for i in range(len(test)):
    tmp = test[i]
    if tmp != '合计':
        target_col.append(i)
print(target_col)

获取车站名和车站编号:

# 获取车站名和车站编号
nfile = pd.read_excel(f, skiprows = 5, skipfooter = 3, usecols = target_col)
arrt = nfile.values
stations_name = []
stations_index = []
for i in range(2,len(arrt[0])):
    stations_index.append(i)
    stations_name.append(arrt[0][i])
print(stations_name)
print(stations_index)

image

接下来定义两个函数,我们希望把所有的数据都写入两个文件夹,一个是”in.csv”存储每个站的进站数据,一个是”out.csv”存储每个站的出站数据。如果目标文件不存在,代码如下:

def process_not_exists(f):
    # 前五行是无用数据
    file = pd.read_excel(f, skiprows = 5, skipfooter = 3, usecols = target_col)
    arr = file.values
    # 构造一个字典先存储数据
    d_in = {}
    d_out = {}
    for i in stations_index:
    # 存储第i个车站的上下客流数据
        d_in[i] = []
        d_out[i] = []
    # 5:30 之后的数据是从excel的50行开始,处理后的数据应从43行开始
    for i in range(43,len(arr)):
        l = arr[i] # 获取第i行的数据
        # 通过条件直接筛选掉“进出站”
        if l[1] == '进站':
            # 进站处理
            for j in range(2,len(l)):
                d_in[j].append(l[j])
        if l[1] == '出站':
            # 出站处理
            for j in range(2,len(l)):
                d_out[j].append(l[j])
    in_list = [] # 存储进站数据
    out_list = [] # 存储出站数据
    for key in d_in:
        # d_in 与 d_out 的key均为车站的index
        in_list.append(d_in[key])
        out_list.append(d_out[key])
        
    df_in = pd.DataFrame(in_list)
    df_in.to_csv("./data/in.csv", header = True, index = None)
    df_out = pd.DataFrame(out_list)
    df_out.to_csv("./data/out.csv", header = True, index = None)

如果目标文件存在,读取部分与目标文件不存在时相同,在处理输出时要进行修改,代码如下:

# 目标文件存在时
def process_exists(f,target_file_in,target_file_out):
    
    infile = pd.read_csv(target_file_in)
    outfile = pd.read_csv(target_file_out)
    
    in_arr = infile.values.tolist()
    out_arr = outfile.values.tolist()
    
    # 前五行是无用数据
    file = pd.read_excel(f, skiprows = 5, skipfooter = 3, usecols = target_col)
    arr = file.values
    # 构造一个字典先存储数据
    d_in = {}
    d_out = {}
    for i in stations_index:
    # 存储第i个车站的上下客流数据
        d_in[i] = []
        d_out[i] = []
    # 5:30 之后的数据是从excel的50行开始,处理后的数据应从43行开始
    for i in range(43,len(arr)):
        l = arr[i] # 获取第i行的数据
        # 通过条件直接筛选掉“进出站”
        if l[1] == '进站':
            # 进站处理
            for j in range(2,len(l)):
                d_in[j].append(l[j])
        if l[1] == '出站':
            # 出站处理
            for j in range(2,len(l)):
                d_out[j].append(l[j])
    in_list = [] # 存储进站数据
    out_list = [] # 存储出站数据
    for key in d_in:
        # d_in 与 d_out 的key均为车站的index
        in_list.append(d_in[key])
        out_list.append(d_out[key])
        
    #合并原有数据
    for i in range(len(in_arr)):
        in_arr[i] += in_list[i]
        out_arr[i] += out_list[i]
    # in_file
    df_in = pd.DataFrame(in_arr)
    df_in.to_csv("./data/in_test.csv",mode = 'r+', header = True, index = None)
    # out_file
    df_out = pd.DataFrame(out_arr)
    df_out.to_csv("./data/out_test.csv",mode = 'r+', header = True, index = None)

对于DataFrame中的数据获取方法有两种:第一种为通过file.iloc[i,j]的方式定位第i行第j列的数据;第二种为通过file.values将file转换为ndarray的数据格式,由于可以事先知道数据每一列的具体含义,直接通过整数下标的方式访问数据。

代码中使用的是第二种方式,这是由于DataFrame的iloc[]函数访问效率低,当数据体量很大时,遍历整个表格的速度会非常慢,而将DataFrame转换为ndarray后,遍历整个表格的数据效率会有显著提升。

下面是主函数,即可完成所有数据的提取。

for name in filenames:
    f = "./data/" + name
    target_file_in = "./data/in_test.csv"
    target_file_out = "./data/out_test.csv"
    # 若文件已存在
    if Path(target_file_in).exists() and Path(target_file_out).exists():
        print("exist")
        process_exists(f,target_file_in,target_file_out)
        #break
    else:
        print("not exist")
        process_not_exists(f)

print("done")

公众号本文地址:https://mp.weixin.qq.com/s/Uc4sUwhjLTpOo85ubj0-QA

标签:arr,target,数据,获取,file,csv,NumPy,Pandas,out
From: https://www.cnblogs.com/kohler21/p/18353866

相关文章

  • git项目的地址获取及自动clone.
    痛点:项目使用的git项目过多,我的目前60多个。文件夹当时创建的时候比较杂乱。后期找项目比较困难。执行方案:迁移项目,根据git地址内的文件夹进行对应的文件夹创建,#!/usr/bin/python3#-*-coding:utf-8-*-importos,subprocessdefget_folder_list(path=os.getcwd(),......
  • Python数据科学的秘密武器:Pandas库的深度解析
    标题:Python数据科学的秘密武器:Pandas库的深度解析Python作为数据科学领域的宠儿,其强大的数据处理能力离不开Pandas库的加持。Pandas是一个开源的数据分析和操作库,它提供了快速、灵活和表达力强的数据结构,旨在使数据清洗和分析工作变得更加简单易行。本文将深入探讨Pandas库......
  • 【数据分析---- Pandas进阶指南:核心计算方法、缺失值处理及数据类型管理】
    前言:......
  • python 如何获取当前时间
    python如何获取当前系统的时间1、导入包import datetime2、获取当前的时间curr_time = datetime.datetime.now()# 2019-07-06 14:55:56.873893 <class 'datetime.datetime'>curr_time.year# 2019 <class 'int'>curr_time.month# 7 <class......
  • python 如何获取毫秒级系统时间
    python如何获取毫秒级系统时间?下面给大家举个例子:import timeimport datetimet = time.time()print (t)                #原始时间数据print (int(t))              #秒级时间戳print (int(round(t * 1000)))     #毫秒......
  • 【ESP01开发实例】-ESP-01网络天气数据获取
    ESP-01网络天气数据获取文章目录ESP-01网络天气数据获取1、硬件准备与接线2、天气数据获取准备3、代码实现在本文中,将展示如何使用ESP8266(ESP-01)Wi-Fi模块构建一个简单的互联网气象站。ESP8266可以访问互联网(网页)并从为全球许多城市提供免费天气......
  • Python使用PyCharm+PySide6+Pandas创建QTableView显示Excel工作簿数据
    importsysimportwarningsfrompathlibimportPathimportpandasaspdfromPySide6importQtWidgetsfromPySide6.QtCoreimportQtfromPySide6.QtGuiimportQStandardItemModel#读取Excel工作簿数据defread_excel_with_pandas(path_excel,_cols):"&qu......
  • JS【详解】数据类型检测(含获取任意数据的数据类型的函数封装、typeof、检测是否为 nul
    【函数封装】获取任意数据的数据类型/***获取任意数据的数据类型**@paramx变量*@returns返回变量的类型名称(小写字母)*/functiongetType(x){//获取目标数据的私有属性[[Class]]的值constoriginType=Object.prototype.toString.call(x);//......
  • Spring Cloud全解析:注册中心之Eureka服务获取和服务续约
    服务获取和服务续约eureka客户端通过定时任务的方式进行服务获取和服务续约,在com.netflix.discovery.DiscoveryClient类中,启动了两个定时任务来进行处理privatevoidinitScheduledTasks(){//是否需要拉取if(clientConfig.shouldFetchRegistry()){//......
  • python3使用pyVmomi获取vCenter中告警信息语音告警
    原创文档编写不易,未经许可请勿转载,目前仅发布于博客园,其他平台均为非法转载。文档中有疑问的可以邮件联系我文章。邮箱:[email protected]一、说明文章分享在pyVmomi获取vCenter中的告警信息,对red级别的告警信息进行本地语音告警,记录告警信息到本地txt文件后清空当前vCenter上的......