pandas實現datetime64與unix時間戳互轉

datetime64與unix時間戳互轉

在用pandas處理數據時,經常要處理一些時間類型數據,經常把pandas時間類型與datetime模塊,還有python自帶的time模塊搞混淆,記錄之。

unix 時間戳與pandas中的Timestamp互轉

import time
def unixToTime(unixtime):
    return pd.to_datetime(unixtime,unit='s',utc=True).tz_convert('Asia/Shanghai') #utc時間比上海時間少8小時,做時區轉換
 
def timeToUnix(dt64):
    return dt64.astype('datetime64[s]').astype('int')
 
unixtime = 1514737265
print(unixToTime(unixtime))
 
#python 自帶time模塊的local_time可以直接轉北京時間
struct_time = time.localtime(unixtime)
print(struct_time)
#轉化格式
dd = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
print(dd)

輸出:

2018-01-01 00:21:05+08:00
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=21, tm_sec=5, tm_wday=0, tm_yday=1, tm_isdst=0)
2018-01-01 00:21:05

datetime模塊

python中還有一個datetime模塊,這個模塊包含一些函數,如today,now,fromtimestamp,strptime,Datetime

from datetime import datetime
import pandas as pd
startTime = datetime.now()
print(startTime)
print(type(startTime))
 
#datetime 字符串轉時間戳
timestr = '2018-01-01 00:21:05'
date_time = datetime.strptime(timestr, "%Y-%m-%d %H:%M:%S")
print(type(date_time))
print(date_time)

輸出:

2020-12-16 22:22:42.451086
<class 'datetime.datetime'>

#pandas 字符串轉時間戳
pd_time = pd.to_datetime(time,format="%Y-%m-%d %H:%M:%S")
 
#或者
#time = datetime(2018,1,1,0,21,5)
#pd_time = pd.to_datetime(timestr,format="YYYY-MM-DD HH:MM:SS")
 
print(type(pd_time))
print(pd_time)

輸出:

<class 'datetime.datetime'>
2018-01-01 00:21:05

#取到年,月,日,日期,小時,分鐘,秒以及一周中的第幾天
year = pd_time.year
month =  pd_time.month
day = pd_time.day
date =  pd_time.date
hour =  pd_time.hour
minute =  pd_time.minute
seconds =  pd_time.second
print(year)
print(month)
print(day)
print(hour)
print(minute)
print(seconds)

輸出:

2018
1
1
0
21
5

pandas默認時間格式轉換為unix間戳

Pandas讀取csv文件時,時間會自動顯示為‘YYYY-MM-DD HH:MM:SS’的格式,那麼如果想要將這個時間轉換為 Unix時間戳 呢?

先科普一下,什麼是 Unix時間戳 呢?

Unix時間戳 是一種時間表示方式,是一個整型值,代表從格林威治時間1970年01月01日00時00分00秒起至現在經過的總秒數。

舉個栗子

一個值為 1492751843 的Unix時間戳 ==>

把它轉換為 北京時間為 2017/4/21 13:17:23

實際上,Pandas中時間用 pandas.datetime() 轉換為 pandas.tslib.Timestamp(時間戳) 格式之後,已經變成瞭整型存儲,即 Unix時間戳形式 。

如果我們需要這個時間戳的整型格式,可以用 time[0].value 這個屬性把它提取出來。

樣例

>>> import pandas as pd     # 導入pandas庫
>>> data = pd.read_csv('airquality.csv')        # 讀入數據文件
>>> data.time = pd.to_datetime(data.time)   # 將時間那一列從str轉換為時間戳格式
>>> type(data.time[0])      # 查看轉換之後的格式
<class 'pandas.tslib.Timestamp'>
>>> data.time[0]            # 查看第一條數據,默認顯示為‘YYYY-MM-DD HH:MM:SS'格式
Timestamp('2014-05-01 00:00:00')
>>> data.time[0].value  # 查看第一條數據的Unix時間戳格式
1398902400000000000L
>>> data.time[0].value//10**9   # 轉換為秒級
1398902400L
>>> t1 = [t.value for t in data.time]   # 提取整列(納秒級,即1s = 1,000,000,000 ns)
>>> t1[:3]      # 顯示前三條數據
[1398902400000000000L, 1398906000000000000L, 1398909600000000000L]
>>> t2 = [t.value//10**9 for t in data.time]    # 提取整列(秒級)
>>> t2[:3]      # 顯示前三條數據
[1398902400L, 1398906000L, 1398909600L]
>>> t1 = pd.DatetimeIndex(t1)       # 從list列表轉換為pandas的DatetimeIndex格式
>>> t1[:3]      # 顯示前三條數據
DatetimeIndex(['2014-05-01 00:00:00', '2014-05-01 01:00:00',
               '2014-05-01 02:00:00'],
              dtype='datetime64[ns]', freq=None)
>>> type(t1[0])     # 每條數據為Timestamp格式
<class 'pandas.tslib.Timestamp'>
>>> t1[0].value
1398902400000000000L

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: