一、时间戳介绍

云平台上的数据通常以timestamp为时间戳,现在有个需求,需要将timestamp时间转换成datetime时间


TimesTamp,一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。

DateTime,也就是我们平时使用的格式,例如某年某月某日某时某分,从“1000-01-01 00:00:00” 到“9999-12-31 23:59:59”之间。显然,DateTime是一个包含日期、时间的类型。

接下来获取的同一时刻的两种不同格式的时间,在Spyder开发环境里面输入以下python代码,

import  time
import datetimeprint('此刻的TimesTamp时间:',time.time())
print()
print('此刻的Datatime时间:',datetime.datetime.now().strftime("%Y-%m-%d-%H:%M")  )

可以看到运行后的结果为,

此刻的TimesTamp时间: 1551497501.2004924此刻的Datatime时间: 2019-03-02-11:31

这就是两种格式时间的区别,其实它们是一一对应的。

现在问题是这样的,由于车辆会将每秒采样到的CAN数据上传到云平台但是这种数据是以TimesTamp时间戳记录的,而我下载以后需要对该时间戳进行转换,以方便我进行数据的分析。

二、编写脚本

首先我用notepad++打开我下载的源数据文件“data.asc”,该文件里面的部分内容如下所示,

date Tue Jan 08 02:18:44 PM 2019
base hex timestamps absolute
Begin Triggerblock Tue Jan 08 02:18:44 PM 201915469.19100 1  103        Rx d 8 6a 08 00 00 80 7b 0d 1015469.19100 1  172        Rx d 8 3c 6e 50 08 43 1c 0d 9115469.19100 1  266        Rx d 8 01 00 00 00 00 00 04 0015469.19100 1  325        Rx d 8 00 00 8e b0 b2 b4 02 0015469.19100 1  360        Rx d 8 fb 03 e8 0d 0e 7f 21 0315469.19100 1  363        Rx d 8 a6 00 10 56 00 07 01 2315469.19100 1  375        Rx d 8 80 00 00 00 80 00 00 0015469.19100 1  168        Rx d 8 8c 21 a9 46 19 09 00 0315469.19100 1  2a1        Rx d 8 51 02 00 00 12 01 07 9215469.19100 1  2a8        Rx d 8 7d 70 81 64 8b 7f f2 0215469.19100 1  36b        Rx d 8 81 e6 a0 79 20 88 20 7e15469.19100 1  374        Rx d 8 10 00 90 00 91 d1 00 0015469.19100 1  39e        Rx d 8 00 02 87 dc 1d 1f 13 6015469.19100 1  5d2        Rx d 8 52 cc cc cc cc cc cc cc15469.19100 1  37a        Rx d 8 7c a8 f3 cf 3c f3 cf 3c15469.19100 1  3ba        Rx d 8 80 02 6a 57 3f 6a 57 47

显然,第一列的timestamps数据格式有点问题,对于第一个时间15469.19100,其实1546919100才是我想要的。

我的处理思路就是,将asc文件中的内容以字符串的形式读入,这时候将会得到一个嵌套列表,其中每一个列表元素代表每一行的数据。通过提取出每一行的时间值进行处理,然后重新覆盖原来的值,最后写回asc文件。过程很简单,接下来就是实际操作啦。

在开发环境spyder中新建一个脚本文件 test.py ,编写如下代码,

# -*- coding: utf-8 -*-import time
from datetime import datetime
from tkinter import *
import tkinter.filedialogdef read_file(file_path):with open (file_path,'r') as f:lines = f.readlines()return linesdef modifyTimeStamp( string_data):split_line = string_data.split(' ')# 每一行数据都是一个字符串,# 以空格为切分符,对字符串进行切分,得到一个列表,# print(split_line),部分结果展示如下,# ['', '', '15469.19759', '1', '', '3cf\t\tRx', 'd', '8', '08', '24', '00', '00', '00', '00', '00', '14\n']# ['', '', '15469.19759', '1', '', '17a\t\tRx', 'd', '8', '4e', '4f', '4d', '00', '89', '8a', '02', '00\n']temp_1 = int(split_line[2][0:5])# 取出时间值中小数点前的数字# print(temp_1) ,部分结果展示如下,# 15469# 15469temp_2 = int(split_line[2][6:11])# 取出时间值中小数点后的数字# print(temp_2) ,部分结果展示如下,# 19759# 19759new_temp_2  = "%05d"  % temp_2# 防止第一位数字为0时被剔除掉,即防止09759被强制保留为9759converted_time = str( temp_1) + new_temp_2  # 对小数点前和后的数字重新拼接,拼接前先字符串化                    localTime = time.localtime(int(converted_time) ) strTime = time.strftime("%Y-%m-%d %H:%M:%S", localTime) # 将timestamps时间转换为Datetime时间,# 再将Datetime时间按照我们设置的格式(即"%Y-%m-%d %H:%M:%S")输出# print(strTime),部分结果展示如下,# 2019-01-08 11:55:59# 2019-01-08 11:55:59return split_line,strTimeif __name__ == "__main__":start_time = time.time()# 记录程序运行时的起止时间root = Tk()           # 创建一个Tkinter.Tk()实例root.withdraw()   # 将Tkinter.Tk()实例隐藏input_file = tkinter.filedialog.askopenfilename(title=u'选择文件')  # 以对话框的形式选择一个文件,并返回其绝对路径,保存在变量filenames中data_lines = read_file(input_file)# 读入asc源数据文件output_file = tkinter.filedialog.asksaveasfilename(title=u'保存文件')# 以对话框的形式选择用于保存结果的文件名,并返回其绝对路径,保存在变量output_file中print('已读取完毕,文件总行数为:%d' %len(data_lines))with open(output_file,'w') as fp:  for i in range(len(data_lines)):if i > 3:split_line,strTime = modifyTimeStamp( data_lines[i] )       split_line[2] = strTime# 用转换后得到的Datetime值替换原来的timestamps值s2 = " ".join([e for e in split_line])  # 将列表中的所有字符串元素连接起来,变成一个长长的字符串      #print(s2)# 部分结果展示如下:# 2019-01-08 11:55:34 1  380            Rx d 8 03 00 51 00 39 00 00 00# 2019-01-08 11:55:34 1  324            Rx d 8 40 64 07 d0 00 30 0a 6ffp.write(s2)# 写入文件else:fp.write(data_lines[i])# 前三行是备注信号,按照原样写入print('时间戳转换成功!!')print("--- 花费时间 %s seconds ---" % (time.time() - start_time)) # 记录程序运行完毕时的时间,再减去起始时间,得到脚本运行所用的时间

三、运行结果

运行脚本以后,首先会弹出一个对话框,让你选择待读取的文件,然后又会弹出一个对话框,再次让你选择一个用于保存结果的文件,如下图所示,

最后,打开我用于保存结果的result.asc文件,可以看到里面的部分内容为,

date Tue Jan 08 02:18:44 PM 2019
base hex timestamps absolute
Begin Triggerblock Tue Jan 08 02:18:44 PM 20192018-12-28 22:58:20 1  103        Rx d 8 6a 08 00 00 80 7b 0d 102018-12-28 22:58:20 1  172        Rx d 8 3c 6e 50 08 43 1c 0d 912018-12-28 22:58:20 1  266        Rx d 8 01 00 00 00 00 00 04 002018-12-28 22:58:20 1  325        Rx d 8 00 00 8e b0 b2 b4 02 002018-12-28 22:58:20 1  360        Rx d 8 fb 03 e8 0d 0e 7f 21 032018-12-28 22:58:20 1  363        Rx d 8 a6 00 10 56 00 07 01 232019-01-08 11:45:00 1  375        Rx d 8 80 00 00 00 80 00 00 002019-01-08 11:45:00 1  168        Rx d 8 8c 21 a9 46 19 09 00 032019-01-08 11:45:00 1  2a1        Rx d 8 51 02 00 00 12 01 07 922019-01-08 11:45:00 1  2a8        Rx d 8 7d 70 81 64 8b 7f f2 02

四、pyinstaller将脚本打包成.exe的可执行文件

PyInstaller 是一个十分有用的第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。但是要注意版本的问题,之前因为python版本太高,装的是3.7,怎么搞都不行。之后降到3.6才可以,后来才发现,pyinstaller最高支持3.6。

首先要确保已经安装好 pyinstaller 模块,这个很简单,只需要进入cmd,使用pip命令安装:pip install PyInstaller即可。列出 pyinstaller 的常用参数,常用的如下:

  • -F 表示生成单个可执行文件
  • -w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
  • -p 表示你自己自定义需要加载的类路径,一般情况下用不到
  • -i 表示可执行文件的图标

然后在cmd中进入脚本所在的目录,输入以下内容(最后的是文件名), Pyinstaller -F -w test.py即可。

执行完毕后,源文件所在目录将生成 dist 和 build 两个文件夹。 其中,build 目录是 pyinstaller 存储临时文件的目录,可以安全删除。最终的打包程序在 dist 文件夹中。如下所示,



至此,简单的任务就完成了。

数据挖掘 (一)——ASC文件读写、时间戳转换、可执行文件打包相关推荐

  1. 如何将asc文件转换成的txt文件,并导入到sql server中?

    最近的工作是利用Arcgis处理得到pixels 数据,再用erdas 软件将pixels 数据转换成 ASCII码,最终生成了asc文件(文件中的数据每3个数据为一组,分别表示了: 横坐标X:纵坐标 ...

  2. 数据挖掘之Python基础(二)函数与文件读写

    前言 前一篇文章我们讲到了Python的基本的数据结构,如果对于Python不是很熟悉,建议先看前一篇文章,或者关注公众号QStack,里面有全部文章. if条件语句 基本所有语言的if条件语句都差不 ...

  3. ios dat 文件读写_Xilisoft iPad Magic Platinum for Mac(ios设备文件传输和转换工具)_资源共享论坛...

    Xilisoft iPad Magic Platinum for Mac是一款ios设备文件传输和转换工具,可以帮助用户将Mac上的应用程序,电影和音乐放到iPad上,无需iTunes即可将iPad应 ...

  4. 基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

    基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件 致谢 1 为什么要使用流式输入输出(使用情景) 2 目标.主要思路及相关方法 2.1 目标 2.2 ...

  5. matlab读文件函数程序,Matlab 文件读写函数

    MATLAB中的文件 m文件: 命令行方式程序可读性差,而且不能存储,对于复杂的问题,应编写成能存储的程序文件.包含matlab语言代码的文件称为m文件,其扩展名为m. 用户如想灵活应用matlab去 ...

  6. Python解析CANoe录制的blf文件asc文件通用方法

    Python解析CANoe录制的blf文件&asc文件通用方法 一.背景     由于很多时候我们在录制日志文件的时候更愿意选择BLF文件,至少目前我见到的很多公司都是使用的BLF文件来作为最 ...

  7. python os读取文件内容_python基础之文件读写

    python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使用os模块的一些方法如下: 得到 ...

  8. JAVA CP936编码转utf8_对一个目录的文件从cp936转换成utf-8

    打开一个文件,确认能够无乱码打开 [xw@localhost work]$ vi NPOSP/src/sjl05.cpp 但是,这里打开的方式是以cp936的编码方式打开的. 编码的选择,记录在~/. ...

  9. 《C++程序设计POJ》《WEEK7 输入输出和模板》《流操纵算子》《文件读写》《二进制文件读写》...

    函数指针,运算符重载 人懂我精,人精我深 用的时候查一查手册 dat 二进制文件 如果不指定文件夹,就是生成在当前文件夹,什么是当前文件夹?可执行文件所在的文件夹 绝对路径 相对路径 文件的读写指针 ...

最新文章

  1. Python有了concurrent的话mutiprocessing和threading还有存在的意义吗?
  2. spring配置JDBC事务
  3. 怎么在linux操作python_pythonlinux怎么操作
  4. Swift 3到5.1新特性整理
  5. Android艺术探索笔记 - 创建AIDL文件后自动生成的文件分析
  6. C语言求正弦的泰勒展开,用泰勒公式求sin(x)的近似值
  7. LVS_DR实现过程...
  8. js中~~和^=分别代表什么,用处是什么?
  9. java常问算法题_Java面试中经常问到的算法题
  10. html静态页面作跳转
  11. java面试的职业规划怎么说_java面试技巧-职业规划有技巧
  12. 服务器lsass系统错误,Win7系统提示Lsass.exe系统错误的原因及解决
  13. 关于提升短信ROI,我的6点思考
  14. 21受限玻尔兹曼机RBM
  15. yii 添加,操作成功,但数据并没有插入到数据库中
  16. maven自定义插件-mojo标注和参数
  17. C++面向对象程序设计习题1:分数相加
  18. 14. 手机蓝牙遥控机器人制作
  19. Linux驱动——mmc sd card 块设备读写流程(十三)
  20. Android中当一行显示两个TextView时,第一个可“…”,而第二个必须显示全部

热门文章

  1. 【转载】Windows 10 运行 Linux子系统的图形界面程序
  2. 11.28计算机导论课后总结
  3. 对自己狠一点-----胡言乱语
  4. 第一章 Python初探
  5. 第3章 结构之法——电话号码对应英语单词
  6. 洛谷 P1293 班级聚会
  7. 鸿蒙系统一直重启怎么办,我的电脑能开机随后就是进不了系统一直黑在那边,时间长了就自动重启...
  8. 这些微信头像,你敢换吗?
  9. 业内人士给龙年买房人的15条忠告 看到的有福了
  10. 网易云邮箱如何添加网页企业级账号