python模拟生成新能源车辆数据

目录

前言

一、随机生成数据:

二、导入pyhdfs库、创建连接并写入文件:

总结:


前言

        小白在入门Pythonon后,已经知道了python的一些基本类型和语法,今天来做一个模拟生成新能源车辆数据。

        我们来编写一个程序,每天凌晨3点模拟生成当天的新能源车辆数据(字段信息必须包含:车架号、行驶总里程、车速、车辆状态、充电状态、剩余电量SOC、SOC低报警、数据生成时间等)


一、随机生成数据:

导入数据库

import random
import time
import radar

2、随机生成车架号、位置的全值:

用于随机生成车辆识别号(VIN),车辆识别号是由17位字符组成的编码,用于唯一标识一辆车辆。

def random_vin():
    # 随机生成车架号
    content_map = {
        'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5,
        'F': 6, 'G': 7, 'H': 8, 'I': 0, 'J': 1, 'K': 2, 'L': 3,
        'M': 4, 'N': 5, 'O': 0, 'P': 7, 'Q': 8, 'R': 9, 'S': 2, 'T': 3,
        'U': 4, 'V': 5, 'W': 6, 'X': 7, 'Y': 8, 'Z': 9, "0": 0, "1": 1,
        "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9
    }
    # 位置的全值
    location_map = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2]
    vin = ''.join(random.sample('0123456789ABCDEFGHJKLMPRSTUVWXYZ', 17))
    num = 0
    for i in range(len(vin)):
        num = num + content_map[vin[i]] * location_map[i]
    vin9 = num % 11
    if vin9 == 10:
        vin9 = "X"
    list1 = list(vin)
    list1[8] = str(vin9)
    vin = ''.join(list1)
    return vin

3、随机生成行驶总里程

随机生成一个里程数。其中使用了random.uniform函数来生成在1000到100000之间的一个浮点数,然后使用round函数将其保留两位小数。

def rando_mileage():
    mileage = round(random.uniform(1000, 100000), 2)
    return mileage


4、随机生成车速跟车辆状态

1、使用random.uniform(0, 200)函数生成一个在0到200之间的随机浮点数,表示车辆的速度,使用round函数将该浮点数保留两位小数,将保留两位小数后的结果作为生成的车速返回。

2、定义一个包含两个元素的列表state,表示车辆的状态,列表中的元素可以根据实际需要进行修改。使用random.sample(state, 1)函数从列表中随机选择一个元素,并以列表形式返回,通过索引[0]取出列表中的元素,并将其作为生成的车辆状态返回。

def random_car_speed():
    # 随机生成车速
    car_speed = round(random.uniform(0, 200), 2)
    return car_speed


def random_state():
    # 随机生成车辆状态
    state = ['start', "unstart"]
    return random.sample(state, 1)[0]

5、随机生成充电状态 充电:放电:空闲

定义一个包含三个元素的列表state,分别表示充电、放电和空闲状态。

使用random.sample(state, 1)函数从列表中随机选择一个元素,并以列表形式返回。

通过索引[0]取出列表中的元素,并将其作为生成的充电状态返回。

def random_charge_state():
    # 随机生成充电状态 充电:放电:空闲
    state = ['recharge', "discharge", "leisure"]
    return random.sample(state, 1)[0]

6、随机生成剩余电流SOC

使用random.uniform(0, 100)函数生成一个在0到100之间的随机浮点数,表示剩余电量的百分比。

使用round函数将该浮点数保留两位小数。

将保留两位小数后的结果作为生成的剩余电量SOC返回。

def random_dump_energy():
    # 随机生成剩余电量SOC
    return round(random.uniform(0, 100), 2)

7、随机生成时间并转成时间数组,随机生成soc

1、接收一个参数datetimestr,表示时间字符串,转换时间字符串为时间数组,可以通过适当的函数来实现具体的转换逻辑,返回转换后的时间数组。

2、定义一个包含两个元素的列表state,表示SOC的状态。列表中的元素可以根据实际需要进行修改,使用random.sample(state, 1)函数从列表中随机选择一个元素,并以列表形式返回,通过索引[0]取出列表中的元素,并将其作为生成的SOC状态返回。

def random_time(datetimestr):
    # 随机生成时间
    # 转换成时间数组
    return datetimestr


def random_soc():
    # 随机生成soc
    state = ['no', "yes"]
    return random.sample(state, 1)[0]

8、随机生成前几天时间

def random_otherday_time(start, end):
    '''
        start:起始时间
        end:终止时间
        "2023-06-01T03:00:00","2023-06-29T03:00:00"
    '''
    otherDay_time = radar.random_datetime(start, end)
    return otherDay_time.strftime('%Y-%m-%d %H:%M:%S')


def generated_data(datetimeStr, number):
    '''
        生成数据
        datetimeStr: 需要生成的日期时间
        number: 生成数据条数
    '''

    data = []
    # 需要生成数据条数
    '''
        车架号:vin  行驶总里程:mileage     车速:car_speed
        车辆状态:state  充电状态:charge_state   剩余电量:dump_energy
        SOC低报警:soc   数据生成时间:time
    '''
    for i in range(number):
        values = {"vin": random_vin(), "mileage": rando_mileage(), "car_speed": random_car_speed(),
                  "state": random_state(),
                  "charge_state": random_charge_state(), "dump_energy": str(random_dump_energy()) + "%",
                  "soc": random_soc(),
                  "time": random_time(datetimeStr)}
        # print(values)
        # 时间戳+2,数据生成时间离上条数据间隔2秒

        # 转换成时间数组
        timeArray = time.strptime(datetimeStr, "%Y-%m-%d %H:%M:%S")
        # 转换成时间戳
        timeStamp = time.mktime(timeArray)
        timeStamp += 2
        # 转换成localtime
        time_local = time.localtime(timeStamp)
        # 转换成新的时间格式(2016-05-05 20:28:54)
        datetimeStr = time.strftime("%Y-%m-%d %H:%M:%S", time_local)

        data.append(values)
    return data


if __name__ == '__main__':
    result = []
    duplicate_data = []
    # 今天时间
    today_time = "2023-06-30 03:00:00"
    # 3、生成今天的数据,一百条
    data = generated_data(today_time, 100000)

    # 4、每天生成的数据中要有少量(20条左右)重复数据(所有字段都相同的两条数据则认为是重复数据)
    for i in range(20):
        duplicate_data.append(data[random.randrange(0, len(data))])
    # 把获取到的数据添加到data后面即可出现重复数据
    result = data + duplicate_data

    # 5、每天生成的数据中要混有少量前几天的数据,这里生成10条6月1到6月30的数据
    other_count = 10
    for i in range(other_count):
        otherday = random_otherday_time("2023-06-01T03:00:00", "2023-06-29T03:00:00")
        other_data = generated_data(otherday, 1)
        result += other_data

    # 2、车辆数据要按天存储,数据格式是JSON格式,另外如果数据文件大于100M,则另起一个文件存。
    # 每天的数据总量不少于300M。比如假设程序是2023-01-1 03点运行,那么就将当前模拟生成的数据
    # 写入到HDFS的/can_data/2023-01-01文件夹的can-2023-01-01.json文件中,
    # 写满100M,则继续写到can-2023-01-01.json.2文件中,依次类推;

二、导入pyhdfs库、创建连接并写入文件:

首先创建了一个HDFS连接,使用了pyhdfs.HdfsClient,指定了HDFS的主机地址和用户名。

根据today_time的值,提取了日期,并根据日期构建了文件路径/can_data/yyyy-mm-dd/can-yyyy-mm-dd.json。使用fs.create创建了一个新的空文件,路径为上述构建的路径

。使用循环遍历了result列表,这里假设result是一个存储了数据的列表。

在每次循环开始时,通过fs.get_file_status(path).length获取了当前文件的大小,判断是否超过了100M。

如果当前文件大小小于等于100M,则使用fs.append函数向文件中追加一条记录,这里假设result[i]是一个要存储的数据。

如果当前文件大小超过了100M,创建了一个新的文件路径,命名为/can_data/yyyy-mm-dd/can-yyyy-mm-dd.json.n,其中n表示文件的编号。

使用fs.create创建了新的空文件,路径为上述构建的路径。最后,使用j来作为文件编号的计数器,并在每次切换文件时对其进行自增。

import pyhdfs

    # 创建连接
    fs = pyhdfs.HdfsClient(hosts="192.168.116.3:50070", user_name="root")
    # 写入文件的今天时间
    today_time2 = today_time[:10]
    path = "/can_data/" + today_time2 + "/can-" + today_time2 + ".json"
    fs.create(path, "")
    j = 1
    for i in range(len(result)):
        # 检测到文件大于等于100M,切换文件继续继续存储
        if (fs.get_file_status(path).length) <= 1024 * 1024 * 100:
            fs.append(path, str(result[i]) + ",")
        else:
            path = "/can_data/" + today_time2 + "/can-" + today_time2 + ".json.%d" % j
            fs.create(path, "")
            j += 1

最后, 我们来看一下结果展示:


总结:

        今天的分享就到这里了,内容不深,面向小白。如果本博客对你有帮助,欢迎赞赏留言转发,希望大家能在自己喜欢的路上越走越远!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Python可以使用众多库和函数来模拟生成各种类型的数据,以下是一些例子: 1. 生成随机数 可以使用random库中的函数来生成随机数,如下所示: ```python import random # 生成一个0到1之间的随机浮点数 random_number = random.random() print(random_number) # 生成一个指定范围内的随机整数 random_integer = random.randint(1, 100) print(random_integer) ``` 2. 生成随机字符串 可以使用string库中的ascii_letters和digits属性来生成随机字符串,如下所示: ```python import string import random # 生成一个包含10个随机字母和数字的字符串 random_string = ''.join(random.choices(string.ascii_letters + string.digits, k=10)) print(random_string) ``` 3. 生成随机日期 可以使用datetime库中的datetime和timedelta类来生成随机日期,如下所示: ```python import datetime import random # 生成一个指定范围内的随机日期 start_date = datetime.date(2021, 1, 1) end_date = datetime.date(2021, 12, 31) time_delta = end_date - start_date random_date = start_date + datetime.timedelta(days=random.randint(0, time_delta.days)) print(random_date) ``` 4. 生成正态分布数据 可以使用numpy库中的random模块来生成正态分布数据,如下所示: ```python import numpy as np # 生成100个均值为0,标准差为1的正态分布随机数 mu, sigma = 0, 1 random_data = np.random.normal(mu, sigma, 100) print(random_data) ``` 以上只是一些常见的数据生成方法,还有很多其他的方法,可以根据需要选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值