当前位置: 首页 > news >正文

XJTU-SY轴承振动数据集的json自封装

1.最终形式

不用再去翻文档找对应的故障类型,采样率等信息了,所有的信息自包含在.json文件里,15个测试例,一个测试例对应一整个.json文件。

{"dataset": {"name": "XJTU-SY_Bearing_Datasets","memo": "PHM vibration dataset - bearing","author": "xjtu_sy","release_date": "2018","reference of dataset": "https://gr.xjtu.edu.cn/web/yaguolei","DOI": "10.1109/TR.2018.2882682"},"test_case": {"tag": "35Hz12kN\\Bearing1_2","scale_of_sensor": "g","saps": 256000,"len_of_saps": 32768,"shaft_rotation_speed_in_hz": 35,"load_rating_in_N": 12000,"fault_reason": ["Outer race"],"sample_cnt": 161},"sample_data_desc": {"bin_data.desc": "[hexStrOfHorizon, hexStrOfVertical] or [hexStrOfSample]","sample_data_raw.bin_data.type": "float32","sample_data_raw.bin_data.storageType": "hex_in_8bytes_from_float32"},"aux_info": {"auto_generated_date": "2025-05-28 18:32:50","auto_generated_by": "twicave","json_fmt_version": "1.0.20250528","key_word": ["float32","g","hex","h","v","bearing"]},"sample_data_raw": [{"time": "2018-02-15 08:00:00","bin_data": ["3E20E6A2BE15A23D3E3CCB41BDA01B86","3E20E6A2BE15A23D3E3CCB41BDA01B86"]}]
}

1.1 额外的好处 - 占用空间更小

 

2.源码

 2.1 主转换程序

import json, pymysql
from tkinter import FIRST
import gp_dataset_define
import datetime
import copy
import csv
import os
import numpy as np
import re
import struct
import glog as logclass gp_dataset_importer:def __init__(self, dataset_path=r"D:\DataSet\Vibration\西交轴承数据\XJTU-SY_Bearing_Datasets\Data\XJTU-SY_Bearing_Datasets"):log.info(f">>>>>start xjtu-sy bearing dataset transfer...{datetime.datetime.now()}")self.gp_dataset_template = gp_dataset_define.gp_datasetself.test_condition_desc = gp_dataset_define.test_condition_descself.gp_bearing_info = gp_dataset_define.gp_bearing_infoself.original_dataset_path = dataset_pathself.time_of_begin_of_sample = datetime.datetime(2018, 2, 15, 8, 0, 0)self.timespan_of_sample = datetime.timedelta(minutes=1)def get_strOf_time(self, dt):formatted_time = dt.strftime("%Y-%m-%d %H:%M:%S")return formatted_timedef sanitize_filename(self, input_str):# 匹配需要替换的字符:. , / \ # 正则表达式模式解释:[.,/\\\\] 中四个反斜杠是为了匹配单个反斜杠(Python字符串转义+正则转义)pattern = r"[.,/\\\\]"return re.sub(pattern, "_", input_str)def float_array_to_hex(self, float_array, precision='single'):"""将float数组转换为无分隔符的紧密十六进制字符串:param float_array: 输入的float数组:param precision: 'single'(4字节单精度)或 'double'(8字节双精度):return: 十六进制字符串(无分隔符)"""hex_str = ""fmt = '>f' if precision == 'single' else '>d'  # 大端序保证字节顺序一致性for num in float_array:# 将float转为字节序列byte_data = struct.pack(fmt, num)# 转换为十六进制并拼接hex_str += byte_data.hex().upper()  # 大写字母形式return hex_str# 示例log.info(float2hex(26.3, 'single'))  # 输出:41D26666(单精度)#log.info(float2hex(3.1415926535, 'double'))  # 输出:400921FB54442EEA(双精度)def float2hex(self, num, precision='single'):"""将浮点数转换为十六进制字符串:param num: 输入的浮点数:param precision: 'single'(32位单精度) 或 'double'(64位双精度):return: 十六进制字符串(不带前缀)"""if precision == 'single':packed = struct.pack('>f', num)  # 大端序打包为单精度hex_str = packed.hex()elif precision == 'double':packed = struct.pack('>d', num)  # 大端序打包为双精度hex_str = packed.hex()else:raise ValueError("precision 必须是 'single' 或 'double'")return hex_str.upper()#log.info(hex2float('41D26666', 'single'))  # 输出:26.299999237060547(精度损失)def hex2float(self, hex_str, precision='single'):"""将十六进制字符串转换为浮点数:param hex_str: 输入的十六进制字符串(不带前缀):param precision: 'single' 或 'double':return: 浮点数"""byte_data = bytes.fromhex(hex_str)if precision == 'single':return struct.unpack('>f', byte_data)[0]elif precision == 'double':return struct.unpack('>d', byte_data)[0]else:raise ValueError("precision 必须是 'single' 或 'double'")# 自定义递归合并函数def deep_merge(self, source, overrides):for key, value in overrides.items():if isinstance(value, dict) and isinstance(source.get(key), dict):source[key] = deep_merge(source[key], value)else:source[key] = valuereturn sourcedef DealAllTestCase(self):cntOftestCases = len(self.test_condition_desc["test_case"])for n in np.arange(cntOftestCases):self.DealOneTestCase(n)def DealOneTestCase(self, snOfTestCase):#get test case desc        if snOfTestCase<0:returnif snOfTestCase>=len(self.test_condition_desc["test_case"]):returntestCase = self.test_condition_desc["test_case"][snOfTestCase]#get test case path.fullPathOfDataset = copy.deepcopy(self.original_dataset_path)if len(testCase.keys())<=0:returnfirstKeyName = list(testCase.keys())[0]subPathOfTest = firstKeyNamefullPathOfCase = os.path.join(fullPathOfDataset, subPathOfTest)testCase = testCase[firstKeyName]#遍历这个test_case,对所有的.csv依次得到h,v 分量folder_path = fullPathOfCasecsv_count = len([f for f in os.listdir(folder_path) if f.endswith(".csv")])samples = []timeAnchor = copy.deepcopy(self.time_of_begin_of_sample)lenOfRealSamples = csv_count#判断记录数和理论值是否一致log.info(f'开始转换 {subPathOfTest}....{self.get_strOf_time(datetime.datetime.now())}')log.info(f'理论记录数:{testCase["sample_cnt"]}, 实际数据条数:{lenOfRealSamples}, 数据完整:{lenOfRealSamples==testCase["sample_cnt"]}')for sn in np.arange(csv_count):csvFileName = os.path.join(folder_path, f"{sn+1}.csv")h,v = self.LoadOneSampleOfTestCase(csvFileName)oneSamples = {}oneSamples["time"] = self.get_strOf_time(timeAnchor)oneSamples["bin_data"] = [self.float_array_to_hex(h),self.float_array_to_hex(v)]samples.append(oneSamples)timeAnchor += self.timespan_of_samplelog.info(f"{subPathOfTest}...{sn+1:04d}") #不换行log.info("") #换行#整理这个testCasejsonOut = copy.deepcopy(self.gp_dataset_template)jsonOut["aux_info"]["auto_generated_date"] = self.get_strOf_time(datetime.datetime.now())jsonOut["aux_info"]["auto_generated_by"] = "twicave"jsonOut["test_case"]["tag"] = os.path.join(subPathOfTest)mergedObj = self.deep_merge(jsonOut["test_case"], testCase)jsonOut["test_case"] = mergedObjjsonOut["sample_data_raw"] = samples#输出这个testCasememo = self.sanitize_filename(firstKeyName)with open(f'dataset_xjtu_sy_{snOfTestCase+1:02d}_{memo}_raw_sample.json', 'w') as f:json.dump(jsonOut, f)def LoadOneSampleOfTestCase(self, file_path_of_csv):horizontal_signals = []vertical_signals = []with open(file_path_of_csv, newline='') as csvfile:reader = csv.reader(csvfile)next(reader)  # 跳过标题行for row in reader:horizontal_signals.append(float(row[0]))vertical_signals.append(float(row[1]))return (horizontal_signals, vertical_signals)gApp = gp_dataset_importer(r"D:\DataSet\Vibration\西交轴承数据\XJTU-SY_Bearing_Datasets\Data\XJTU-SY_Bearing_Datasets")
gApp.DealAllTestCase()

2.2 转换参数

gp_bearing_info = {"Type":"LDK UER204","Outer race diameter":39.80e-3,"Inner race diameter":29.30e-3,"Bearing mean diameter":34.55e-3,"Ball diameter":7.92e-3,"Number of Ball":8,"Contact angle":0,"Load rating(static)":6.65e3,"Load rating(dynamic)":12.82e3
}test_condition_desc = {"test_case":[{"35Hz12kN\Bearing1_1":{"shaft_rotation_speed_in_hz":35, "load_rating_in_N":12e3, "fault_reason":["Outer race"], "sample_cnt":123}},{"35Hz12kN\Bearing1_2":{"shaft_rotation_speed_in_hz":35, "load_rating_in_N":12e3, "fault_reason":["Outer race"], "sample_cnt":161}},{"35Hz12kN\Bearing1_3":{"shaft_rotation_speed_in_hz":35, "load_rating_in_N":12e3, "fault_reason":["Outer race"], "sample_cnt":158}},{"35Hz12kN\Bearing1_4":{"shaft_rotation_speed_in_hz":35, "load_rating_in_N":12e3, "fault_reason":["Cage"], "sample_cnt":122}},{"35Hz12kN\Bearing1_5":{"shaft_rotation_speed_in_hz":35, "load_rating_in_N":12e3, "fault_reason":["Inner race", "Outer race"], "sample_cnt":52}},{"37.5Hz11kN\Bearing2_1":{"shaft_rotation_speed_in_hz":37.5, "load_rating_in_N":11e3, "fault_reason":["Inner race"], "sample_cnt":491}},{"37.5Hz11kN\Bearing2_2":{"shaft_rotation_speed_in_hz":37.5, "load_rating_in_N":11e3, "fault_reason":["Outer race"], "sample_cnt":161}},{"37.5Hz11kN\Bearing2_3":{"shaft_rotation_speed_in_hz":37.5, "load_rating_in_N":11e3, "fault_reason":["Cage"], "sample_cnt":533}},{"37.5Hz11kN\Bearing2_4":{"shaft_rotation_speed_in_hz":37.5, "load_rating_in_N":11e3, "fault_reason":["Outer race"], "sample_cnt":42}},{"37.5Hz11kN\Bearing2_5":{"shaft_rotation_speed_in_hz":37.5, "load_rating_in_N":11e3, "fault_reason":["Outer race"], "sample_cnt":339}},{"40Hz10kN\Bearing3_1":{"shaft_rotation_speed_in_hz":40, "load_rating_in_N":10e3, "fault_reason":["Outer race"], "sample_cnt":2538}},{"40Hz10kN\Bearing3_2":{"shaft_rotation_speed_in_hz":40, "load_rating_in_N":10e3, "fault_reason":["Inner race", "Ball", "Cage","Outer race"], "sample_cnt":2496}},{"40Hz10kN\Bearing3_3":{"shaft_rotation_speed_in_hz":40, "load_rating_in_N":10e3, "fault_reason":["Inner race"], "sample_cnt":371}},{"40Hz10kN\Bearing3_4":{"shaft_rotation_speed_in_hz":40, "load_rating_in_N":10e3, "fault_reason":["Inner race"], "sample_cnt":1515}},{"40Hz10kN\Bearing3_5":{"shaft_rotation_speed_in_hz":40, "load_rating_in_N":10e3, "fault_reason":["Outer race"], "sample_cnt":114}}
]}gp_dataset = {"dataset": {"name": "XJTU-SY_Bearing_Datasets", "memo": "PHM vibration dataset - bearing", "author": "xjtu_sy", "release_date": "2018","reference of dataset": "https://gr.xjtu.edu.cn/web/yaguolei",     "DOI": "10.1109/TR.2018.2882682"},"test_case": {"tag":"35Hz12kN\\Bearing1_1","scale_of_sensor": "g","saps": 256000,"len_of_saps": 32768,"shaft_rotation_speed_in_hz": 35,"load_rating_in_N": 12000.0,"fault_reason": ["Outer race"],"sample_cnt": 123     },"sample_data_desc":{"bin_data.desc": "[hexStrOfHorizon, hexStrOfVertical] or [hexStrOfSample]",    "sample_data_raw.bin_data.type": "float32","sample_data_raw.bin_data.storageType": "hex_in_8bytes_from_float32"},"aux_info":{"auto_generated_date": "2025-05-28 17:49:13", "auto_generated_by": "twicave", "json_fmt_version": "1.0.20250528","key_word":["float32", "g", "hex", "h", "v", "bearing"]},"sample_data_raw":[{"time":"2025-05-28 15:23:00", "bin_data":[]}]
}

3.转换过程

I0528 18:37:01.526661 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0482
I0528 18:37:01.840653 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0483
I0528 18:37:02.161860 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0484
I0528 18:37:02.485366 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0485
I0528 18:37:02.830887 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0486
I0528 18:37:03.186601 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0487
I0528 18:37:03.510744 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0488
I0528 18:37:03.843738 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0489
I0528 18:37:04.172952 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0490
I0528 18:37:04.488946 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_1...0491
I0528 18:37:04.488946 6128 gp_dataset_import_xjtu_sy.py:136]
I0528 18:37:05.193193 6128 gp_dataset_import_xjtu_sy.py:124] 开始转换 37.5Hz11kN\Bearing2_2....2025-05-28 18:37:05
I0528 18:37:05.193193 6128 gp_dataset_import_xjtu_sy.py:125] 理论记录数:161, 实际数据条数:161, 数据完整:True
I0528 18:37:05.472151 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_2...0001
I0528 18:37:05.752146 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_2...0002
I0528 18:37:06.029141 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_2...0003
I0528 18:37:06.312358 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_2...0004
I0528 18:37:06.591353 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_2...0005
I0528 18:37:06.882348 6128 gp_dataset_import_xjtu_sy.py:135] 37.5Hz11kN\Bearing2_2...0006

相关文章:

  • 基于GA遗传优化的FIR滤波器幅频相频均衡补偿算法matlab仿真
  • 【HTML-14】HTML 列表:从基础到高级的完整指南
  • Qt使用智能指针
  • 泰迪杯特等奖案例深度解析:基于多模态点云融合与域自适应的电力设备缺陷检测系统设计
  • 第五章 宽松内存一致性模型 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • 【多线程初阶】初识线程 创建线程
  • 模型自学推理:自信驱动进化
  • Linux程序与进程
  • Android LiveData 详解
  • 查询oracle进程数和会话数进行优化
  • 友达光电12.1寸液晶屏G121XN01 V001工控屏
  • 深入浅出DeepSeek:从零开始的AI编程指南
  • There is a chart instance already initialized on the dom. 柱状图初始化时报前面这个错误如何解决?
  • 龙虎榜——20250528
  • LeeCode 94. 二叉树的中序遍历
  • 74道Node.js高频题整理(附答案背诵版)
  • 简乐 1.4.0 | 非常简洁 无损下载 畅听全网
  • 头歌之动手学人工智能-Pytorch 之autograd
  • 王树森推荐系统公开课 排序05:排序模型的特征
  • 【NLP】将 LangChain 与模型上下文协议 (MCP) 结合使用
  • 惠州响应式网站哪家好/张雷明履新河南省委常委
  • vb .net网站开发/自己的品牌怎么做加盟推广
  • 高端品牌服装/seo优化服务是什么
  • 网站建设的流程/投放广告的网站
  • 网站流量大小对网站有什么影响/武汉大学人民医院地址
  • 建设一个电商网站的流程是什么/域名信息查询系统