網(wǎng)上看了半天,沒看到一個能夠?qū)懙挠置靼子趾喚毜模宰约嚎偨Y(jié)了一下:
1、python和Matlab的時間戳(timestamp)互相轉(zhuǎn)化
先放結(jié)論,再做解釋,在東八區(qū):
y=(x-719529)*86400+3600*8
x為matlab的時間戳,y為python下的對應(yīng)時間戳
"719529"為1970年1月1日距離公元0000年的天數(shù),86400為一天的秒數(shù),3600為一個小時的秒數(shù),8表征時區(qū)位置,東時區(qū)為正,西時區(qū)為負
原因解釋:
1)基本規(guī)則
matlab里面時間戳表示從公元0000年0時0分到現(xiàn)在的天數(shù)
而python里面的時間戳表示從公元1970年1月1日0時0分到現(xiàn)在的秒數(shù)
2)為什么要加上8小時
實際使用時還需要加上時區(qū)的變化,默認是UTC時間(協(xié)調(diào)世界時,Universal Time Coordinated)(UTC的本質(zhì)強調(diào)的是比GMT(格林威治時間)更為精確的世界時間標準.它其實是個更精確的GMT.),
而GMT(格林威治時間)的概念,大家應(yīng)該熟悉(初中地理),你需要跟當?shù)貢r區(qū)做轉(zhuǎn)換,中國處于東8時區(qū)即GMT+8,所以你算出的時間戳如果是基于中國時間的,那么要加上8*3600秒
那么問題又來了:
3)為什么會采用1970年1月1日作為時間戳起始點?
因為用32位來表示時間的最大間隔是68年,而最早出現(xiàn)的UNIX操作系統(tǒng)考慮到計算機產(chǎn)生的年代和應(yīng)用的時限綜合取了1970年1月1日作為UNIX TIME的紀元時間(開始時間),至于時間回歸的現(xiàn)象隨著64為操作系統(tǒng)的產(chǎn)生逐漸得到解決,因為用64位操作系統(tǒng)可以表示到約2930億年。
2、Matlab里時間戳、字符串和datetime的轉(zhuǎn)化
1)時間戳和字符串的相互轉(zhuǎn)化
timestamp?= datenum(date_str)
date_str =?datestr(timestamp ,format)
比如:
datenum('1970-01-01') = 719529
datestr(719529,'yyyy-mm-dd') =?'1970-01-01'
2)時間戳和datetime的相互轉(zhuǎn)化
基本思路:時間戳-字符串-datetime
time = datetime(datestr(timestamp?))
需要注意的是字符串格式會影響結(jié)果的輸出,比如:
3、python里時間戳、字符串和時間數(shù)組的轉(zhuǎn)化
python里面的datetime又稱為時間數(shù)組
在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()????#將當前時間轉(zhuǎn)換為struct_time
time.localtime(a)????#將a轉(zhuǎn)換為struct_time
time.gmtime(a)????#將時間轉(zhuǎn)換為struct_time
time.ctime(a)????#將時間戳轉(zhuǎn)換為時間字符串
也可以使用datetime庫下的函數(shù)進行轉(zhuǎn)換:
d=datetime.datetime.fromtimestamp(a)????#將a轉(zhuǎn)換為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)????#轉(zhuǎn)換為字符串
time.strftime("%a %b %d %H:%M:%S %Y",a)????#轉(zhuǎn)換為字符串
str1 = a.strftime("%Y-%m-%d %H:%M:%S")? ??#轉(zhuǎn)換為字符串,格式不同
time.mktime(a)????#轉(zhuǎn)換為時間戳,結(jié)果為秒級,如果想要得到毫秒級的需要乘1000
c.字符串-->struct_time,PS:字符串不能直接轉(zhuǎn)換為時間戳,需要先轉(zhuǎn)為struct_time
b = '2013-10-01 14:05:32'
c = time.strptime(b,'%Y-%m-%d %H:%M:%S')????#按照格式轉(zhuǎn)換為9元組,具體符號含義可以查time.strptime函數(shù):
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里面的數(shù)據(jù)放在python里面測試,時間列需要變成時間索引:
point_synfes=point_synfes.dropna(subset=['time'])? ?#去nan,避免后面time函數(shù)報錯
point_synfes['time'] = (point_synfes['time'] -719529) *86400 +3600 *8? ? #matlab時間戳轉(zhuǎn)化為python時間戳
temp_trian = [pd.Timestamp(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(i)))for iin point_synfes['time'].values]? ? #時間列轉(zhuǎn)為需要的格式
point_synfes.index = temp_trian? ? #設(shè)置時間列為索引
del point_synfes['time']? ? #刪除原時間列
# 轉(zhuǎn)化過程會有一些改變副本的操作警告,不過我的目的只是測試,所以就沒有進一步修改了