Python和Pandas对事件数据的处理:以电动汽车充电数据为例

2023-09-19 09:42:59

1、数据

电动汽车的充电数据形式如下 

订单号充电开始时间充电完成时间订单/时段总充电量(KWh)尖时电量峰时电量平时电量谷时电量
2023020105000026122023-02-01 00:03:262023-02-01 00:40:5228.4410.0000.0000.00028.441
2023020105000045702023-02-01 00:10:282023-02-01 01:01:3545.3190.0000.0000.00045.319
2023020105000047282023-02-01 00:10:322023-02-01 01:27:1357.3120.0000.0000.00057.312
2023020105000049592023-02-01 00:11:322023-02-01 01:16:4525.4920.0000.0000.00025.492
2023020105000069692023-02-01 00:22:592023-02-01 01:36:3844.8890.0000.0000.00044.889
2023020105000070762023-02-01 00:24:132023-02-01 00:40:539.1310.0000.0000.0009.131
2023020105000070822023-02-01 00:24:352023-02-01 00:40:518.1870.0000.0000.0008.187
2023020105000078652023-02-01 00:29:272023-02-01 01:31:3933.8940.0000.0000.00033.894
2023020105000086632023-02-01 00:35:202023-02-01 01:20:3128.2400.0000.0000.00028.240
2023020105000087552023-02-01 00:35:502023-02-01 01:32:0431.7520.0000.0000.00031.752

 2、目标任务

以5分钟为一个时段,需要知道每天每个时段的总充电量,最终结果如下所示

3、数据处理

Python代码在《excel_pandas.py》中,具体如下

import pandas as pd
import time
import os

start_time = time.time()  # 开始计时
carDF = pd.read_excel(io='./carChageTime.xlsx')# 读取xlsx(相对路径)


# 将时间字符串转换为时间戳
carDF['start_time'] = pd.to_datetime(carDF['充电开始时间'])
carDF['end_time'] = pd.to_datetime(carDF['充电完成时间'])

# 建立空表,以5分钟为间隔
start_index_time = pd.to_datetime('2023-02-01')
end_index_time = pd.to_datetime('2023-07-31')
power_index = pd.date_range(start=start_index_time, end=end_index_time, freq='5min')

power_excel = pd.DataFrame(data=0, columns=['power'], index=power_index)
pass

start_index_bill = 0
end_index_bill = 52000
for index in range(start_index_bill, end_index_bill):  # 260
    print(start_index_bill, '/', index, '/', end_index_bill)
    count = 0
    
    num_5minutes = (carDF['end_time'][index] - carDF['start_time'][index]) // pd.Timedelta("5T")
    if num_5minutes == 0:  # 0不能做除数
        power_average = carDF['订单/时段总充电量(KWh)'][index]  # 将每一个订单的总电量均分
        # print('num_5minutes=0', 'index=', index, 'power=', power_average)
        # print(carDF['start_time'][index], carDF['end_time'][index])
        for x in power_index:
            if carDF['start_time'][index] <= x:
                power_excel.loc[x] = power_excel.loc[x] + power_average
                break
    else:
        power_average = carDF['订单/时段总充电量(KWh)'][index] / num_5minutes
        for x in power_index:
            if carDF['start_time'][index] <= x <= carDF['end_time'][index]:
                count = count + 1
                if count > num_5minutes:
                    break
                else:
                    power_excel.loc[x] = power_excel.loc[x] + power_average
        pass
    
# 保存结果
realTime = time.strftime('%Y%m%d%H%M%S', time.localtime())
file_name = os.path.basename(__file__)[0:-3]
power_excel.to_csv('{0}_{1}_{2}_{3}.csv'.format(file_name, realTime, start_index_bill, end_index_bill))

# 打印程序的运行时间
end_time = time.time()
print("end_time-start_time={}".format(end_time - start_time))

最终生成一个《excel_pandas_slice_20230918194213_0_52000.csv》,内容如下

4、进一步处理

 Python代码在《csv_to_excel.py》中,具体如下

import pandas as pd
import time
import os

start_time = time.time()  # 开始计时
df_RNN = pd.read_csv('excel_pandas_slice_20230918194213_0_52000.csv')  # 读取xlsx(相对路径)

# 行名
start_index_time = pd.to_datetime('2023-02-01 00:05:00')  # Timestamp('2023-02-01 00:00:00')
end_index_time = pd.to_datetime('2023-02-02 00:00:00')  # Timestamp('2023-07-31 00:00:00')
power_index = pd.date_range(start=start_index_time, end=end_index_time, freq='5min')

# 列名
start_column_time = pd.to_datetime('2023-02-01')  # Timestamp('2023-02-01 00:00:00')
end_column_time = pd.to_datetime('2023-7-31')  # Timestamp('2023-07-31 00:00:00')
power_column = pd.date_range(start=start_column_time, end=end_column_time, freq='D')

power_excel = pd.DataFrame(data=0, columns=power_column, index=power_index)

# num_5minutes用于记录一天被划分为了多少个时间段
# 这里以5分钟为一个时间段,所以num_5minutes=288
t_step = pd.Timedelta("5T")  # 时间间隔5minutes
num_5minutes = (end_index_time - start_index_time) // t_step + 1  # 288
pass

for i in range(df_RNN.shape[0] // num_5minutes):
    power_excel.loc[:, power_column[i]] = list(df_RNN['power'][i * num_5minutes:(i + 1) * num_5minutes])

# 保存结果
realTime = time.strftime('%Y%m%d%H%M%S', time.localtime())
file_name = os.path.basename(__file__)[0:-3]
power_excel.to_excel('{0}_{1}.xlsx'.format(file_name, realTime))

# 打印程序的运行时间
end_time = time.time()
print("end_time-start_time={}".format(end_time - start_time))

 最终生成一个《excel_to_csv_20230918203118.xlsx》,内容如下

 这里在excel对《excel_to_csv_20230918203118.xlsx》的索引进行了设置单元格式处理

5、绘图 

绘图参考

EXCEL如何在一个图上画多条曲线-百度经验 (baidu.com)

参考另一篇博客

Python模块之pandas中时间戳之间的相互转换_飞由于度的博客-CSDN博客

更多推荐

数据结构 - 线性表(顺序表)

线性表是什么线性表是包含若干数据元素的一个线性序列,记为:L=(a0,…ai-1,ai,ai+1,…an-1)L为表名,ai(0≤i≤n-1)为数据元素;n为表长,n>0时,线性表L为非空表,否则为空表。线性表L可用二元组形式描述(程序员间的表述):L=(D,R)即线性表L包含数据元素集合D和关系集合RD={ai|ai

服务器数据恢复-LINUX操作系统下各文件系统误删除/格式化数据的恢复方案

服务器数据恢复环境:基于EXT2/EXT3/EXT4/Reiserfs/Xfs文件系统的Linux操作系统。服务器故障:LINUX操作系统下误删除/格式化数据。服务器数据恢复过程:1、首先会检测服务器是否存在硬件故障,如果检测出硬件故障,交由硬件工程师处理。2、检测故障表现是否与用户描述相同。3、以只读方式对故障服务器

Apollo使用和安装

项目管理部门添加使用json格式编辑即可用户管理添加用户创建项目对项目进行管理授权在创建应用的时候,授权在项目页面中授权用户只能看见自己负责的项目管理员可以看到所有项目删除项目先输入AppId查询应用点击删除应用,即可删除配置管理新增配置对新添的和修改的配置项需要发布,才能生效客户端读取配置项在启动的时候,指定AppI

案例丨如何提升可视化分析能力?听听这两家企业怎么说

神策分析2.5版本正式发布经营分析能力以来,已有不少客户接入使用,并充分实现了可视化分析能力的提升。本文将为大家分享两家客户的真实反馈,希望能够帮助您进一步了解神策经营分析的能力。案例一:神策数据助力美篇打造公司级“数据可视化平台”“我们希望接入神策数据之后,能够更清晰、便捷、完整、及时地查看和分析平台内容消费情况、社

拓世法宝|短视频带货风潮,数字人教育书单号成销售黑马

Z世代的爸妈,正在搞一种很新的育儿方式。“躺平式”带娃、“用魔法打败魔法”等新时代育儿方式频频登上热搜,作为与互联网共同成长起来的一代,Z世代父母们更热衷于通过网络攻略获得和分享知识和经验,更注重个性的养育方式,并且伴随整体消费水平的提高,科学和精致化育儿已经逐渐成为现下带娃的主流趋势。Z世代父母们喜欢在短视频平台上购

spring boot 整合多数据源

多数据源产生的场景一般情况下,不会有多数据源这样的场景出现,但老项目或者特殊需求的项目,可能会有这样的场景同一个应用需要访问两个数据库不用数据库中间件的读写分离注入数据源选择的时机声明两个数据源实例,在getConnection的时候根据业务的不同,注入不同数据源的连接环境准备准备sql脚本,建立两个库,这里mysql

java使用正则提取数据

一、正则提取文本指定数据需要对一个json结构做数据的提取,提取label和value的值,组成新的结构,西瓜:0、苹果:1、草莓:2原始json字符串如下格式[{"label":"西瓜","value":0},{"label":"苹果","value":1},{"label":"草莓","value":2},{"la

LeetCode2.两数相加

一看完题,我的想法是先算出这两个链表表示的数,然后相加,然后把这个数一位一位的分配给第三个数组,这种方法应该很简单但是要遍历三次数组,于是我就想直接一遍遍历,两个链表同时往后面遍历,把这两个数的和给第三个链表,如果有进位,下一个数加1;但是写完之后出现的问题,因为我的循环是先创建下一个链表然后,指针指向这个链表,然后再

AI绘图软件Stable Diffusion 安装和使用之二controlnet插件

本期说一下StableDiffusion非常有名的插件controlnet。同上一篇一样,我们安装b站大佬秋葉aaaki(有的网友戏称他/她是赛博佛祖)的stablediffusion4.2整合包。解压缩以后,打开启动器,见下图,界面比早期版本更好看了。​编辑​启动器打开以后,安装controlnet插件填写网址:ht

【文生图系列】如何在Stable Diffusion Webui中使用ControlNet

文章目录ControlNetStableDiffusion+ControlNet安装ControlNet插件bug例子展示参考ControlNetControlNet是一个神经网络结构,通过添加额外的条件控制扩散模型。给定任务条件,ControlNet能够提升已训练好的图像扩散模型。对于任意一个神经网络块,如下图所示,

【面试经典150 | 数组】跳跃游戏 II

文章目录写在前面Tag题目来源题目解读解题思路方法一:贪心写在最后写在前面本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:Tag:介绍本题牵涉到的知识点、数据结构;题目来源

热文推荐