数据分析编程检验——车流量统计(不能使用pandas和numpy)

目录

一、要求展示

二、获取内容

        1、从文本中取内容

​         2、对文本中的内容处理

 三、需求计算

        1、按车辆编号对数据进行分组,统计采样时间间隔

                ①分组

                 ②计算

四、源码


一、要求展示

        数据分析编程检验——车流量统计(不能使用pandas和numpy)_第1张图片

二、获取内容

        1、从文本中取内容

        写一个程序时,可以边写边查看,这样可以避免代码写多了之后出现BUG时不容易解决,因为可能是因为之前的代码导致后面的问题

        

        当文本的数据很多时,如果每次都读取全部的数据则会花很多的时间,所以可以拷贝一段数据在一个测试的文档中,测试文档实现之后再用全部的数据能节省很多时间

        查看结果知道所有的数据存储在一个列表中,接下来的操作就是遍历列表了,将数据取出来

contents = open("./附件一/test.txt").readlines()
print(contents)

         2、对文本中的内容处理

        通过查看获取的文本的内容可知,列表中的每个元素最后都是带有\n的,输出时也就是一整行的空格,此时就需要将空格给去掉了,需要用到strip
        strip的作用就是消除前后的空格,返回的是字符串,然后再将字符串用空格切割,将想要的数据分离出来
        因为取的数据正好是第一个和最后一个,所以不需要去数在第几个

for content in contents:
    record_arry = content.strip().split(" ")
    print(record_arry[0],record_arry[-1])

数据分析编程检验——车流量统计(不能使用pandas和numpy)_第2张图片

 三、需求计算

        1、按车辆编号对数据进行分组,统计采样时间间隔

                ①分组

        python代码的分组需要做的操作就是将数据用字典的形式存储起来,也就是一个键对应着多个值

        当键在字典中的时候,需要的是添加到键的列表中,不在的时候就是创建键值对

        此处有一个技巧或者说难点,就是如何在存在的时候将数据加到列表的值中,关键点在于创建键值对的时候就将值的类型设置成列表类型的,需要加时就直接调用列表的append方法即可,如果不设置的话,也就是值的格式为字符串类型,此时要想再加就困难了

 key_str = record_arry[0]
    time_str = record_arry[-1]
    if key_str in result:
        result[key_str].append(time_str)

    else:
        result[key_str] = [time_str]#关键在于将此处的类型设置为列表

print(result,end='\n')

                 ②计算

        因为得到的时间是字符串类型的,做差求时间间隔是按照10进制的方式进行的,但是真正的时间是按照60进制进行的,所以需要转换为时间类型的

        datetime.strptime()可以将字符串转换成为时间类型的函数,需要导入datetime包

        此时存到列表中的值是一个datetime类型,但是在计算以及print时输出的是时间

key_str = record_arry[0]
    time_str = record_arry[-1]
    if key_str in result:
        result[key_str].append(datetime.strptime(time_str,'%Y%m%d%H%M%S'))
        # print(datetime.strptime(time_str,'%Y%m%d%H%M%S'))

    else:
        result[key_str] = [datetime.strptime(time_str,'%Y%m%d%H%M%S')]
        # print(datetime.strptime(time_str, '%Y%m%d%H%M%S'))
print(result)

         将其转换为时间类型之后就可以对其进行排序了,排序之后再做差就能得到结果

        因为涉及几个数据的计算,所以可以将其封装到一个函数中,然后一些返回

        题目要求的是对时间间隔进行统计,也就是在之前的基础上去再计算

def computer_gap(sort_list:list):
    """
    对统计指标进行计算
    :param sort_list:
    :return:
    """
    gap_arry = []#收集gap的值
    row_sorted = sorted(sort_list)#排序
    #得到时间间隔
    for idx in range(1,len(row_sorted)):
        gap = (row_sorted[idx] - row_sorted[idx-1]).seconds
        if gap<300:
            gap_arry.append(gap)
    a = len(gap_arry)#返回的是间隔数量
    #返回的是间隔的中位数
    if a%2 != 0:
        b = gap_arry[int(a/2)]
    else:
        b = gap_arry[int(a/2)] + gap_arry[int(a/2)-1]
    #返回的是间隔的平均数
    c = sum(gap_arry)/a
    return a,b,c

四、源码

# -*- coding: utf-8 -*-
from datetime import datetime

def computer_gap(sort_list:list):
    """
    对统计指标进行计算
    :param sort_list:
    :return:
    """
    gap_arry = []#收集gap的值
    row_sorted = sorted(sort_list)#排序
    #得到时间间隔
    for idx in range(1,len(row_sorted)):
        gap = (row_sorted[idx] - row_sorted[idx-1]).seconds
        if gap<300:
            gap_arry.append(gap)
    a = len(gap_arry)#返回的是间隔数量
    #返回的是间隔的中位数
    if a%2 != 0:
        b = gap_arry[int(a/2)]
    else:
        b = gap_arry[int(a/2)] + gap_arry[int(a/2)-1]
    #返回的是间隔的平均数
    c = sum(gap_arry)/a
    return a,b,c


contents = open("./附件一/test.txt").readlines()
# print(contents)
result = {}
for content in contents:
    record_arry = content.strip().split(" ")
    # print(record_arry[0],record_arry[-1])
    key_str = record_arry[0]
    time_str = record_arry[-1]
    if key_str in result:
        # 如果存在将数据加入分组
        result[key_str].append(datetime.strptime(time_str,'%Y%m%d%H%M%S'))
        # print(datetime.strptime(time_str,'%Y%m%d%H%M%S'))

    else:
        # 如果不存在,创建分组,并初始化第一个元素
        result[key_str] = [datetime.strptime(time_str,'%Y%m%d%H%M%S')]
        # print(datetime.strptime(time_str, '%Y%m%d%H%M%S'))

result_gap = {}
with open("result.txt","a+") as fp:
    for key_str in result:
        car_arry = result[key_str]
        if len(car_arry) > 1:
            a,b,c = computer_gap(car_arry)
            fp.write(key_str + '\t' + str(a) + '\t' + str(b) + '\t' + str(c) + '\n')

数据分析编程检验——车流量统计(不能使用pandas和numpy)_第3张图片 

 

你可能感兴趣的:(#,刷题,数据分析)