【Pyhon数据处理】Pandas+datetime模块 实现对日期字段按小时分组,算出记录数最多/最少的是哪个小时

python笔记 同时被 2 个专栏收录
3 篇文章 0 订阅
2 篇文章 0 订阅

任务背景【可跳过不看】

某天,fu老师给我发了个QQ,让我根据借还数据统计出30天内每小时借车人数最高有多少、最低有多少。而就这么一个短短的QQ消息,这么一个看似很简单(实际上也很简单)的任务,我花了一个多小时才搞定。看了下老师布置任务的时间,再看了下我回复的时间,属实尴尬。因此特此将实现过程写下记录、以供自己和其他人人参考(主要供自己)

 

任务描述:

你拥有一个借车信息的数据表,数据表中有一个字段是借车时间,借车时间字段格式如下所示,例如:

这张数据表存储了N天的借车信息,有上万条这样的借车记录,现在要求你统计30天内,借车数最大/最小的是哪一天的哪个小时,共借了多少量。其实也就是要对所有记录按小时分组,统计哪个分组的记录数最多 、最少。

 

核心思路

1.导出数据到TXT文件,只要导出需要分组的“时间"字段

2.利用pandas读取txt文件

3.利用datetime模块,将日期字段记录转换为datetime对象

4.将日期字段升序排序

5.for循环计数,找出最大最小值

 

实现步骤

step1:将数据从数据库中导出为txt文件。

这一步比较简单,由于只需要对时间进行分组,所以导出时只要导出“借车时间”字段即可【其他字段也用不上】。

本文使用的数据库是MSSQL,这里强烈安利使用Navicat这个软件,太好用了,选中数据表右键点击导出向导,然后一步步跟着向导走就可以了。(用SQL Server Management经常会出各种奇奇怪怪的BUG)。

注意在导出时“文本识别符号要设置为”无“,日期排序要设置为"YMD"

 

保存完毕后我的TXT文件数据长这样

 

step2:利用pandas读取txt文件

pandas.read_csv() !!!

import pandas as pd
pd.read_csv('txt文件的路径',sep=',',header=None)

Pandas相关知识点在这里就不展开了

安利一个pandas教程网站:https://www.yiibai.com/pandas/python_pandas_series.html

 

step3:利用datetime模块,将字符串转换为datetime对象

Python datetime模块详解https://www.cnblogs.com/awakenedy/articles/9182036.html

越来越觉得python的一些库功能真的很强大,之前我和同学手写代码好不容易写了一个把日期转换成秒的函数还经常报错通用性差。现在才知道python有这么方便的模块早就把功能都实现了,相见恨晚!datetime模块的具体用法可以参考上面的网站,这里我只把我做的将日期转换为秒的过程写出来。

import datetime
import pandas as pd

def string_toDatetime(st):
    return datetime.datetime.strptime(st, "%Y/%m/%d %H:%M:%S")

df = pd.read_csv('文件名.txt',sep=',',header=None)
df[0]=df[0].apply(string_toDatetime).copy()

于是乎打印df,可以看到结果如下

 

Step4:将日期字段升序排序

这样做的目的是为了Step5用for循环操作时不会出现意外,一行代码就可以搞定

df=df.sort_values(by=0).copy()

Step5:利用for循环实现按小时分组计数

因为datetime.hour可以获取日期里是第几个小时,所以一切都变得简单了

代码与注释如下

mmax=-1 #保存最大值
mmin=9999#保存最小值
pre=0 #上一个小时
temp=0 #临时变量,用来记录当前小时的记录数

for index,row in df.iterrows():
    if pre!=row[0].hour: #如果当前的小时,不等于上一个小时,判断最大值最小值是否需要更新
        pre=row[0].hour
        if temp>mmax:
            mmax=temp
            maxdate=row[0]
        elif temp<mmin:
            mmin=temp
            mindate=row[0]
        temp=0
    temp+=1

 

  • 2
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值