這一節依然是關於時間的知識, 在平時的工作中, 有一個非常令我們惱火的就是時間的格式可以有很多種表達, 比如下面這張圖, 我們看到同樣是 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~~~
本作品採用《CC 協議》,轉載必須註明作者和本文連結