前言
该文章所使用的资料可以私聊获取
该项目小白不用担心,因为全部都有注释,不用担心看不懂 (贴心boy)
所有代码为完整的代码,不用担心(放心)
项目使用的xlse文件(表格部分截图)
先看完成实现效果(0_0)
各个按钮实现情况图
项目结构
btn.py文件代码
import pygame
class Button:
def __init__(self, screen,centerxy,width,height,button_color,text_color,msg,size):
"""
创建一个按钮对象
参数:
screen:pygame.Surface对象,代表屏幕
centerxy:tuple,代表按钮的中心坐标
width:int,代表按钮的宽度
height:int,代表按钮的高度
button_color:tuple,代表按钮的背景颜色
text_color:tuple,代表按钮上文字的颜色
msg:str,代表按钮上显示的文字
size:int,代表字体的大小
"""
self.screen = screen # 设置屏幕属性
self.width, self.height = width, height # 设置宽度和高度属性
self.button_color = button_color # 设置按钮颜色属性
self.text_color = text_color # 设置文字颜色属性
self.font = pygame.font.SysFont('SimHei', size) # 设置字体属性
self.rect = pygame.Rect(0, 0, self.width, self.height) # 创建一个矩形对象,设置宽度和高度属性
self.rect.centerx = centerxy[0] # 设置矩形的中心点x坐标
self.rect.centery = centerxy[1] # 设置矩形的中心点y坐标
self.deal_msg(msg) # 处理消息方法
def deal_msg(self,msg):
"""
处理按钮上的文字图片
参数:
msg:str,按钮上显示的文字
"""
self.msg_img = self.font.render(msg, True, self.text_color) # 创建一个图像对象,将传入的文本渲染为图像,并设置文字为前景颜色和背景颜色
self.msg_img = self.font.render(msg, True, self.text_color, self.button_color) # 创建一个图像对象,将传入的文本渲染为图像,并设置文字为前景颜色和背景颜色
self.msg_img_rect = self.msg_img.get_rect() # 创建一个矩形对象,用于表示图像的位置和大小
self.msg_img_rect.center = self.rect.center # 设置图像矩形的中心点为父对象矩形的中心点
def draw_button(self):
# 绘制按钮背景
self.screen.fill(self.button_color,self.rect)
# 绘制按钮文字
self.screen.blit(self.msg_img,self.msg_img_rect)
import sys # 导入sys模块,用于退出程序和打印错误信息
import pygame # 导入pygame模块,用于开发跨平台的电子游戏和多媒体应用程序
import btn # 导入btn模块,用于处理按钮的相关操作
import TimeUtil # 导入TimeUtil模块,用于处理时间相关操作
pygame.init() # 初始化pygame模块
# size = width, height = 320,240 # 设置窗口大小为800x600
size = width, height = 360,240 # 设置窗口大小为800x600
WHITE = (255,255,255) # 定义白色RGB值
BLUE = (72,61,139) # 定义蓝色RGB值
screen = pygame.display.set_mode(size) # 创建一个pygame屏幕对象,并设置屏幕的大小
screen.fill(WHITE) # 将屏幕填充为白色
while True:
# button1 = btn.Button(screen, (90, 50), 140, 60, BLUE, WHITE, '关闭窗口', 20) # 创建一个矩形按钮对象,指定位置、尺寸、颜色、文字颜色、文字内容和文字大小
# button1.draw_button() # 绘制按钮
# 创建按钮1
btn1 = btn.Button(screen, (90, 50), 140, 60, BLUE, WHITE, '停车时间分布', 20)
# 绘制按钮1
btn1.draw_button()
# 创建按钮2
btn2 = btn.Button(screen, (90, 130), 140, 60, BLUE, WHITE, '停车高峰时间', 20)
# 绘制按钮2
btn2.draw_button()
# 创建按钮3
btn3 = btn.Button(screen, (90, 210), 140, 60, BLUE, WHITE, '停车场信息', 20)
# 绘制按钮3
btn3.draw_button()
# 创建按钮4
btn4 = btn.Button(screen, (250, 50), 140, 60, BLUE, WHITE, '月收入分析', 20)
# 绘制按钮4
btn4.draw_button()
# 创建按钮5
btn5 = btn.Button(screen, (250, 130), 140, 60, BLUE, WHITE, '接待车辆统计', 20)
# 绘制按钮5
btn5.draw_button()
pygame.display.update() # 更新屏幕显示
for event in pygame.event.get(): # 遍历事件列表
if event.type == pygame.QUIT: # 如果事件类型是退出窗口
pygame.quit() # 退出pygame
sys.exit() # 退出程序
elif event.type == pygame.MOUSEBUTTONDOWN: # 如果事件类型是鼠标按下
# 如果鼠标位置在按钮的水平范围内
if 20 <= event.pos[0] and event.pos[0] <= 90 + 70 and 20 <= event.pos[1] and event.pos[1] <= 50 + 30:
# sys.exit() # 退出程序
TimeUtil.sjfb()
pass
elif 20 <= event.pos[0] and event.pos[0] <= 90 + 70 and 100 <= event.pos[1] and event.pos[1] <= 130 + 30:
TimeUtil.tcgf()
pass # 终止当前函数,不做其他操作
elif 20 <= event.pos[0] and event.pos[0] <= 90 + 70 and 180 <= event.pos[1] and event.pos[1] <= 210 + 30:
TimeUtil.fmtj()
pass
elif 180 <= event.pos[0] and event.pos[0] <= 250 + 70 and 20 <= event.pos[1] and event.pos[1] <= 50 + 30:
TimeUtil.ysrfx()
pass
elif 180 <= event.pos[0] and event.pos[0] <= 250 + 70 and 100 <= event.pos[1] and event.pos[1] <= 130 + 30:
TimeUtil.cljd()
pass
TimeUtil.py文件代码
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import matplotlib.ticker as ticker
# 导入pandas库,用于数据处理和分析
# 导入matplotlib.pyplot库,用于数据可视化
# 导入datetime库,用于处理日期和时间相关函数
def get_week_numbeer(date):
from datetime import datetime
# 导入datetime模块
# 将字符串日期转换为datetime对象
date = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
# 获取日期对应的星期几(0表示星期一,6表示星期日)
day = date.weekday()
# 返回星期几的值
return day
# 停车时间分布图
def sjfb():
# 排除进入停车场未出停车场的车
# 读取停车场信息表的数据
pi_data = pd.read_excel("../datafile/停车场信息表.xlsx")
# 选取timeout不为0的记录
data = pi_data.loc[pi_data['timeout']!=0]
# 将timein和timeout列转换为datetime格式
data['timein']=pd.to_datetime(data['timein'])
data['timeout']=pd.to_datetime(data['timeout'])
# 计算停车时间差
data['h']=data['timeout']-data['timein']
# 设置停车时间分布图的标题
plt.title('停车时间分布图')
# 设置字体样式
plt.rcParams['font.sans-serif'] = ['FangSong']
# 分类统计数据
df1 = data.loc[data['h']<='0 days 01:00:00']
df2 = data.loc[(data['h']>'0 days 01:00:00') & (data['h']<='0 days 02:00:00')]
df3 = data.loc[(data['h']>'0 days 02:00:00') & (data['h']<='0 days 03:00:00')]
df4 = data.loc[(data['h']>'0 days 03:00:00') & (data['h']<='0 days 04:00:00')]
df5 = data.loc[data['h']>'0 days 04:00:00']
# 绘制停车时间分类统计图
x = ['1小时','2小时','3小时','4小时','4小时以上']
y = [len(df1),len(df2),len(df3),len(df4),len(df5)]
plt.bar(x, y)
# 在图中添加每类停车量的标签
for x, y in enumerate(y):
plt.text(x, y+20, str(y)+'台', ha='center')
# 显示图形
plt.show()
pass
# 停车高峰期占比
def tcgf():
# 导入pandas库并读取停车场信息表的Excel文件
data = pd.read_excel("../datafile/停车场信息表.xlsx")
# 设置图表标题为'停车高峰期占比'
plt.title('停车高峰期占比')
# 设置各类别标签
labels = ['0-3点' ,'3-6点','6-9点','9-12点','12-15点','15-18点','18-21点','21-00点']
# 分类统计数据
# 获取具体时间点为00:00的停车数据
kk0 = data[(data['timein'].str.contains(' 00:'))]
# 获取具体时间点为01:00的停车数据
kk1 = data[(data['timein'].str.contains(' 01:'))]
# 获取具体时间点为02:00的停车数据
kk2 = data[(data['timein'].str.contains(' 02:'))]
# 获取具体时间点为03:00的停车数据
kk3 = data[(data['timein'].str.contains(' 03:'))]
# 获取具体时间点为04:00的停车数据
kk4 = data[(data['timein'].str.contains(' 04:'))]
# 获取具体时间点为05:00的停车数据
kk5 = data[(data['timein'].str.contains(' 05:'))]
# 获取具体时间点为06:00的停车数据
kk6 = data[(data['timein'].str.contains(' 06:'))]
# 获取具体时间点为07:00的停车数据
kk7 = data[(data['timein'].str.contains(' 07:'))]
# 获取具体时间点为08:00的停车数据
kk8 = data[(data['timein'].str.contains(' 08:'))]
# 获取具体时间点为09:00的停车数据
kk9 = data[(data['timein'].str.contains(' 09:'))]
# 获取具体时间点为10:00的停车数据
kk10 = data[(data['timein'].str.contains(' 10:'))]
# 获取具体时间点为11:00的停车数据
kk11 = data[(data['timein'].str.contains(' 11:'))]
# 获取具体时间点为12:00的停车数据
kk12 = data[(data['timein'].str.contains(' 12:'))]
# 获取具体时间点为13:00的停车数据
kk13 = data[(data['timein'].str.contains(' 13:'))]
# 获取具体时间点为14:00的停车数据
kk14 = data[(data['timein'].str.contains(' 14:'))]
# 获取具体时间点为15:00的停车数据
kk15 = data[(data['timein'].str.contains(' 15:'))]
# 获取具体时间点为16:00的停车数据
kk16 = data[(data['timein'].str.contains(' 16:'))]
# 获取具体时间点为17:00的停车数据
kk17 = data[(data['timein'].str.contains(' 17:'))]
# 获取具体时间点为18:00的停车数据
kk18 = data[(data['timein'].str.contains(' 18:'))]
# 获取具体时间点为19:00的停车数据
kk19 = data[(data['timein'].str.contains(' 19:'))]
# 获取具体时间点为20:00的停车数据
kk20 = data[(data['timein'].str.contains(' 20:'))]
# 获取具体时间点为21:00的停车数据
kk21 = data[(data['timein'].str.contains(' 21:'))]
# 获取具体时间点为22:00的停车数据
kk22 = data[(data['timein'].str.contains(' 22:'))]
# 获取具体时间点为23:00的停车数据
kk23 = data[(data['timein'].str.contains(' 23:'))]
# 统计各类别停车数量
x = [(len(kk0) + len(kk1) + len(kk2)), (len(kk3) + len(kk4) + len(kk5)), (len(kk6) + len(kk7) + len(kk8)), (len(kk9) + len(kk10) + len(kk11)), (len(kk12) + len(kk13) + len(kk14)), (len(kk15) + len(kk16) + len(kk17)), (len(kk18) + len(kk19) + len(kk20)), (len(kk21) + len(kk22) + len(kk23))]
# 绘制饼图
# 生成一个饼图
plt.pie(x, labels=labels, autopct='%1.1f%%')
# 设置x轴和y轴相等
plt.axis('equal')
# 在右上角添加图例,图例的字体大小为10
plt.legend(loc='upper right', fontsize=10, bbox_to_anchor=(1.1, 0.5), borderaxespad=0.3)
# 显示图形
plt.show()
pass
# 停车星期比
def fmtj():
# 读取停车场信息表的Excel文件
data = pd.read_excel("../datafile/停车场信息表.xlsx")
# 筛选出状态为1的记录
ds=data.loc[data['state']==1]
# 复制筛选结果
ds=ds.copy()
# 将时间列timein转换为DateTime格式
ds['timein']=pd.to_datetime(ds['timein'])
# 统计每周一到周日的停车数量
ds['timeinweek']=ds['timein'].dt.dayofweek
ds2=ds.groupby('timeinweek')
weeksuns=ds2.size()
# 定义星期的标签
labels=['星期一','星期二','星期三','星期四','星期五','星期六','星期天']
# 设置中文字符集为方正字体
plt.rcParams['font.sans-serif']=['FangSong']
# 绘制饼图,显示每周停车数量占比
plt.pie(weeksuns,labels=labels,autopct='%.2f%%')
# 设置图表标题
plt.title('停车星期比')
# 显示图表
plt.show()
pass
# 月收入分析
def ysrfx():
# 读取停车场信息表的Excel文件
data = pd.read_excel("../datafile/停车场信息表.xlsx")
# 筛选出state为1的数据
srdf = data.loc[data['state'] == 1]
# 筛选出2018年1月的数据
kk1 = srdf[(srdf['timeout'].str.contains('2018-01'))]
# 筛选出2018年2月的数据
kk2 = srdf[(srdf['timeout'].str.contains('2018-02'))]
# 筛选出2018年3月的数据
kk3 = srdf[(srdf['timeout'].str.contains('2018-03'))]
# 计算每个月的收入总和
price1 = kk1['price'].sum()
price2 = kk2['price'].sum()
price3 = kk3['price'].sum()
# 设置x轴和y轴的标签
labels_x = ['1月', '2月', '3月']
y = [price1, price2, price3]
# 绘制柱状图
plt.bar(labels_x, y)
# 在每个柱子上显示具体的数值
for x, y in enumerate(y):
plt.text(x, y + 300, str(y) + '元', ha='center')
# 设置标题和总收入
plt.title('2018年1月-3月收入分析-总收入:' + str(price1 + price2 + price3) + '元')
plt.xlabel('月份')
plt.ylabel('收入')
# 显示图形
plt.show()
pass
#每日接待车辆统计
def cljd():
# 读取停车场信息表的Excel文件
data = pd.read_excel("../datafile/停车场信息表.xlsx")
# 筛选出状态为1的数据
data = data.loc[data['state']==1]
# 设置开始日期和结束日期
iin = '2018-01-01'
end = '2018-03-31'
# 使用strptime将字符串转换为时间元组
dataiin = datetime.datetime.strptime(iin,'%Y-%m-%d')
dataend = datetime.datetime.strptime(end,'%Y-%m-%d')
# 初始化x和y列表
x = []
y = []
# 循环遍历日期范围内的每一天
while dataiin <= dataend:
# 将时间元组转换为字符串,并将结果添加到x列表中
x.append(dataiin.strftime('%y-%m-%d'))
# 统计该日期下车辆的数量,并将结果添加到y列表中
y.append(len(data[data['timein'].str.contains(dataiin.strftime('%y-%m-%d'))]))
# 增加一天后继续下一次循环
dataiin = dataiin + datetime.timedelta(days=1)
# 设置中文显示格式
plt.rcParams['font.sans-serif'] = ['SimHei']
# 绘制折线图
plt.plot(x,y)
# 清除刻度标签
plt.xticks([])
# 设置图表标题
plt.title('每日接待车辆统计')
# 设置x轴标签
plt.xlabel('2018-01-01到2018-03-31')
# 显示图形
plt.show()
pass
结尾
没什么说的,愿各位代码无bug。文章来源:https://www.toymoban.com/news/detail-765422.html
网络乞丐求打赏!(❀_❀)文章来源地址https://www.toymoban.com/news/detail-765422.html
到了这里,关于Python智慧停车场运营分析系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!