Pandas 基礎 (17) - to_datetime

Rachel發表於2019-04-28

這一節依然是關於時間的知識, 在平時的工作中, 有一個非常令我們惱火的就是時間的格式可以有很多種表達, 比如下面這張圖, 我們看到同樣是 2017年1月5日, 可以有很多種時間的格式, 我們需要先將格式統一才能進行下面的工作, Pandas 提供了這個函式 to_datetime().

Pandas 基礎(17) - 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)

我們知道關於時間的格式, 美國跟歐洲的格式是不一樣的, 如下圖所示:

Pandas 基礎(17) - to_datetime

如果以歐洲的時間格式表示 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 協議》,轉載必須註明作者和本文連結

相關文章