网上看了半天,没看到一个能够写的又明白又简练的,所以自己总结了一下:
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'] #删除原时间列
# 转化过程会有一些改变副本的操作警告,不过我的目的只是测试,所以就没有进一步修改了