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


    目录

    一、要求展示

    二、获取内容

            1、从文本中取内容

             2、对文本中的内容处理

     三、需求计算

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

                    ①分组

                     ②计算

    四、源码


    一、要求展示

            

    二、获取内容

            1、从文本中取内容

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

            

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

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

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

             2、对文本中的内容处理

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

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

     三、需求计算

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

                    ①分组

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

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

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

    1. key_str = record_arry[0]
    2. time_str = record_arry[-1]
    3. if key_str in result:
    4. result[key_str].append(time_str)
    5. else:
    6. result[key_str] = [time_str]#关键在于将此处的类型设置为列表
    7. print(result,end='\n')

                     ②计算

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

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

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

    1. key_str = record_arry[0]
    2. time_str = record_arry[-1]
    3. if key_str in result:
    4. result[key_str].append(datetime.strptime(time_str,'%Y%m%d%H%M%S'))
    5. # print(datetime.strptime(time_str,'%Y%m%d%H%M%S'))
    6. else:
    7. result[key_str] = [datetime.strptime(time_str,'%Y%m%d%H%M%S')]
    8. # print(datetime.strptime(time_str, '%Y%m%d%H%M%S'))
    9. print(result)

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

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

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

    1. def computer_gap(sort_list:list):
    2. """
    3. 对统计指标进行计算
    4. :param sort_list:
    5. :return:
    6. """
    7. gap_arry = []#收集gap的值
    8. row_sorted = sorted(sort_list)#排序
    9. #得到时间间隔
    10. for idx in range(1,len(row_sorted)):
    11. gap = (row_sorted[idx] - row_sorted[idx-1]).seconds
    12. if gap<300:
    13. gap_arry.append(gap)
    14. a = len(gap_arry)#返回的是间隔数量
    15. #返回的是间隔的中位数
    16. if a%2 != 0:
    17. b = gap_arry[int(a/2)]
    18. else:
    19. b = gap_arry[int(a/2)] + gap_arry[int(a/2)-1]
    20. #返回的是间隔的平均数
    21. c = sum(gap_arry)/a
    22. return a,b,c

    四、源码

    1. # -*- coding: utf-8 -*-
    2. from datetime import datetime
    3. def computer_gap(sort_list:list):
    4. """
    5. 对统计指标进行计算
    6. :param sort_list:
    7. :return:
    8. """
    9. gap_arry = []#收集gap的值
    10. row_sorted = sorted(sort_list)#排序
    11. #得到时间间隔
    12. for idx in range(1,len(row_sorted)):
    13. gap = (row_sorted[idx] - row_sorted[idx-1]).seconds
    14. if gap<300:
    15. gap_arry.append(gap)
    16. a = len(gap_arry)#返回的是间隔数量
    17. #返回的是间隔的中位数
    18. if a%2 != 0:
    19. b = gap_arry[int(a/2)]
    20. else:
    21. b = gap_arry[int(a/2)] + gap_arry[int(a/2)-1]
    22. #返回的是间隔的平均数
    23. c = sum(gap_arry)/a
    24. return a,b,c
    25. contents = open("./附件一/test.txt").readlines()
    26. # print(contents)
    27. result = {}
    28. for content in contents:
    29. record_arry = content.strip().split(" ")
    30. # print(record_arry[0],record_arry[-1])
    31. key_str = record_arry[0]
    32. time_str = record_arry[-1]
    33. if key_str in result:
    34. # 如果存在将数据加入分组
    35. result[key_str].append(datetime.strptime(time_str,'%Y%m%d%H%M%S'))
    36. # print(datetime.strptime(time_str,'%Y%m%d%H%M%S'))
    37. else:
    38. # 如果不存在,创建分组,并初始化第一个元素
    39. result[key_str] = [datetime.strptime(time_str,'%Y%m%d%H%M%S')]
    40. # print(datetime.strptime(time_str, '%Y%m%d%H%M%S'))
    41. result_gap = {}
    42. with open("result.txt","a+") as fp:
    43. for key_str in result:
    44. car_arry = result[key_str]
    45. if len(car_arry) > 1:
    46. a,b,c = computer_gap(car_arry)
    47. fp.write(key_str + '\t' + str(a) + '\t' + str(b) + '\t' + str(c) + '\n')

     

     

  • 相关阅读:
    CVPR 2024 截稿时间
    win+mac通用的SpringBoot+H2数据库集成过程。
    Fluent批处理及.jou和.scm文件编写的相关操作
    Redis中的Lua脚本(一)
    【YOLO系列】YOLOv9论文超详细解读(翻译 +学习笔记)
    Win11 Windows聚焦不更新了怎么解决?聚焦锁屏图片不更换怎么办
    网络协议:Cookie与Session技术
    Raspberry Pi 5 新平台 新芯片组
    MathType7.4绿色和谐版数学公式编辑器
    Linux编程——经典链表list_head
  • 原文地址:https://blog.csdn.net/qq_41404557/article/details/125990089