這一節依然是關於時間的知識, 在平時的工作中, 有一個非常令我們惱火的就是時間的格式可以有很多種表達, 比如下面這張圖, 我們看到同樣是 2017年1月5日, 可以有很多種時間的格式, 我們需要先將格式統一才能進行下面的工作, Pandas 提供了這個函數 to_datetime().
下面通過一個例子來看下它的具體用法:
import pandas as pd dates = ['2017-01-05', 'Jan 5, 2017', '01/05/2017', '2017.01.05', '2017/01/05','20170105'] pd.to_datetime(dates)
輸出:
DatetimeIndex(['2017-01-05', '2017-01-05', '2017-01-05', '2017-01-05', '2017-01-05', '2017-01-05'], dtype='datetime64[ns]', freq=None)
來看下加上時間的效果:
dates = ['2017-01-05 2:30:00 PM', 'Jan 5, 2017 14:30:00', '01/05/2016', '2017.01.05', '2017/01/05','20170105'] pd.to_datetime(dates)
輸出:
DatetimeIndex(['2017-01-05 14:30:00', '2017-01-05 14:30:00', '2016-01-05 00:00:00', '2017-01-05 00:00:00', '2017-01-05 00:00:00', '2017-01-05 00:00:00'], dtype='datetime64[ns]', freq=None)
如果時間的 list 里有無法轉換的字符呢?
dates = ['2017-01-05 2:30:00 PM', 'Jan 5, 2017 14:30:00', '01/05/2016', '2017.01.05', '2017/01/05','20170105', 'ABC'] pd.to_datetime(dates)
報錯了:
TypeError Traceback (most recent call last) /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz) 376 try: --> 377 values, tz = conversion.datetime_to_datetime64(arg) 378 return DatetimeIndex._simple_new(values, name=name, tz=tz) pandas/_libs/tslibs/conversion.pyx in pandas._libs.tslibs.conversion.datetime_to_datetime64() TypeError: Unrecognized value type: <class 'str'> During handling of the above exception, another exception occurred:
這種情況下, 我們需要給 to_datetime() 函數加個參數:
dates = ['2017-01-05 2:30:00 PM', 'Jan 5, 2017 14:30:00', '01/05/2016', '2017.01.05', '2017/01/05','20170105', 'ABC'] pd.to_datetime(dates, errors='ignore')
輸出:
array(['2017-01-05 2:30:00 PM', 'Jan 5, 2017 14:30:00', '01/05/2016', '2017.01.05', '2017/01/05', '20170105', 'ABC'], dtype=object)
非時間字符被原樣輸出了, 還可以設置第二個參數 errors='coerce':
pd.to_datetime(dates, errors='coerce')
輸出:
DatetimeIndex(['2017-01-05 14:30:00', '2017-01-05 14:30:00', '2016-01-05 00:00:00', '2017-01-05 00:00:00', '2017-01-05 00:00:00', '2017-01-05 00:00:00', 'NaT'], dtype='datetime64[ns]', freq=None)
我們知道關於時間的格式, 美國跟歐洲的格式是不一樣的, 如下圖所示:
如果以歐洲的時間格式表示 2019年1月5日, 應該會寫成這樣:
pd.to_datetime('5/1/2019')
但是默認輸出是按照美國的標准:
Timestamp('2019-05-01 00:00:00')
這時, 可以加一個參數指明第一個值為 day:
pd.to_datetime('5/1/2019', dayfirst=True)
輸出:
Timestamp('2019-01-05 00:00:00')
我們通常會用斜線作為年月日的分隔線, 但是其實這個分隔符是可以用任意字符代替的, 比如 $, 比如 #, 因為 Pandas 提供了一個參數 format 可以用來定義時間的表達格式, 比如下面的例子:
pd.to_datetime('5$1$2019', format='%d$%m$%Y')
輸出:
Timestamp('2019-01-05 00:00:00')
用 # 做分隔符的例子:
pd.to_datetime('5#1#2019', format='%d#%m#%Y')
輸出:
Timestamp('2019-01-05 00:00:00')
格林威治時間是從1970年1月1日開始累計的秒數的總和.
我們可以通過下面這個網站獲取時時的格林威治時間:
Epoch & Unix Timestamp Conversion Tools
可以用 to_datetime() 函數轉換格林威治時間:
t = 1551966534 pd.to_datetime(t, unit='s')
輸出:
Timestamp('2019-03-07 13:48:54')
以 list 的形式傳參, 以得到 list 的時間格式:
t = 1551966534 dt = pd.to_datetime([t], unit='s') dt
輸出:
DatetimeIndex(['2019-03-07 13:48:54'], dtype='datetime64[ns]', freq=None)
通過 Pandas 的 view() 函數還可以將其再轉換成格林威治時間:
dt.view('int64')
輸出:
array([1551966534000000000])
以上, 就是關於 to_datetime() 函數的基本使用方法, enjoy~~~