python和Matlab里时间戳/字符串/datetime的转化

网上看了半天,没看到一个能够写的又明白又简练的,所以自己总结了一下:

1、python和Matlab的时间戳(timestamp)互相转化

先放结论,再做解释,在东八区:

y=(x-719529)*86400+3600*8

x为matlab的时间戳,y为python下的对应时间戳

"719529"为1970年1月1日距离公元0000年的天数,86400为一天的秒数,3600为一个小时的秒数,8表征时区位置,东时区为正,西时区为负

原因解释:

1)基本规则

matlab里面时间戳表示从公元0000年0时0分到现在的天数

而python里面的时间戳表示从公元1970年1月1日0时0分到现在的秒数

2)为什么要加上8小时

实际使用时还需要加上时区的变化,默认是UTC时间(协调世界时,Universal Time Coordinated)(UTC的本质强调的是比GMT(格林威治时间)更为精确的世界时间标准.它其实是个更精确的GMT.),

而GMT(格林威治时间)的概念,大家应该熟悉(初中地理),你需要跟当地时区做转换,中国处于东8时区即GMT+8,所以你算出的时间戳如果是基于中国时间的,那么要加上8*3600秒

那么问题又来了:

3)为什么会采用1970年1月1日作为时间戳起始点?

因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),至于时间回归的现象随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到约2930亿年。


2、Matlab里时间戳、字符串和datetime的转化

1)时间戳和字符串的相互转化

timestamp = datenum(date_str)

date_str = datestr(timestamp ,format)

比如:

datenum('1970-01-01') = 719529

datestr(719529,'yyyy-mm-dd') = '1970-01-01'

2)时间戳和datetime的相互转化

基本思路:时间戳-字符串-datetime

time = datetime(datestr(timestamp ))

需要注意的是字符串格式会影响结果的输出,比如:


3、python里时间戳、字符串和时间数组的转化

python里面的datetime又称为时间数组

在Python中,通常有这三种方式来表示时间:时间戳、格式化的时间字符串、元组(struct_time)

(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

(2)格式化的时间字符串(Format String): ‘1988-03-16’

(3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等

a.时间戳-->struct_time,字符串

a= 1462091932.0000045

time.localtime()    #将当前时间转换为struct_time

time.localtime(a)    #将a转换为struct_time

time.gmtime(a)    #将时间转换为struct_time

time.ctime(a)    #将时间戳转换为时间字符串

也可以使用datetime库下的函数进行转换:

d=datetime.datetime.fromtimestamp(a)    #将a转换为struct_time

d:    datetime.datetime(2016, 5, 1, 16, 38, 52, 5)


b.struct_time-->字符串,时间戳

a = 1462091932.0000045

a =  time.localtime(a)

b = time.asctime(a)    #转换为字符串

time.strftime("%a %b %d %H:%M:%S %Y",a)    #转换为字符串

str1 = a.strftime("%Y-%m-%d %H:%M:%S")    #转换为字符串,格式不同

time.mktime(a)    #转换为时间戳,结果为秒级,如果想要得到毫秒级的需要乘1000


c.字符串-->struct_time,PS:字符串不能直接转换为时间戳,需要先转为struct_time

b = '2013-10-01 14:05:32'

c = time.strptime(b,'%Y-%m-%d %H:%M:%S')    #按照格式转换为9元组,具体符号含义可以查time.strptime函数:

https://www.runoob.com/python/att-time-strptime.html


d.实际演示

a = 1462099131.9999979

b = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(a))  

[output]    '2016-05-01 18:38:51'

pd.Timestamp(b)  

[output]    Timestamp('2016-05-01 18:38:51')


4、备忘

其实整理这篇文档的目的是在做策略的时候碰到了这样一个问题:我需要把matlab里面的数据放在python里面测试,时间列需要变成时间索引:

转化前

point_synfes=point_synfes.dropna(subset=['time'])   #去nan,避免后面time函数报错

point_synfes['time'] = (point_synfes['time'] -719529) *86400 +3600 *8    #matlab时间戳转化为python时间戳

temp_trian = [pd.Timestamp(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(i)))for iin point_synfes['time'].values]    #时间列转为需要的格式

point_synfes.index = temp_trian    #设置时间列为索引

del point_synfes['time']    #删除原时间列

# 转化过程会有一些改变副本的操作警告,不过我的目的只是测试,所以就没有进一步修改了

转化后
数据格式

你可能感兴趣的:(python和Matlab里时间戳/字符串/datetime的转化)