Pandas日期時間格式化
當進行數據分析時,我們會遇到很多帶有日期、時間格式的數據集,在處理這些數據集時,可能會遇到日期格式不統一的問題,此時就需要對日期時間做統一的格式化處理。比如“Wednesday, June 6, 2020”可以寫成“6/6/20”,或者寫成“06-06-2020。
日期格式化符號
在對時間進行格式化處理時,它們都有固定的表示格式,比如小時的格式化符號為%H
,分鐘簡寫為%M
,秒簡寫為%S
。下表對常用的日期格式化符號做了總結:
符號 | 說明 |
---|---|
%y | 兩位數的年份表示(00-99) |
%Y | 四位數的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月內中的一天(0-31) |
%H | 24小時制小時數(0-23) |
%I | 12小時制小時數(01-12) |
%M | 分鐘數(00=59) |
%S | 秒(00-59) |
%a | 本地英文縮寫星期名稱 |
%A | 本地英文完整星期名稱 |
%b | 本地縮寫英文的月份名稱 |
%B | 本地完整英文的月份名稱 |
%w | 星期(0-6),星期天為星期的開始 |
%W | 一年中的星期數(00-53)星期一為星期的開始 |
%x | 本地相應的日期表示 |
%X | 本地相應的時間表示 |
%Z | 當前時區的名稱 |
%U | 一年中的星期數(00-53)星期天為星期的開始 |
%j | 年內的一天(001-366) |
%c | 本地相應的日期表示和時間表示 |
Python處理
Python 內置的 strptime() 方法能夠將字符串日期轉換為 datetime 類型,下面看一組示例:
import pandas as pd
from datetime import datetime
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")date_str =empdata.loc[:,'HIREDATE']
for d in date_str:print(f"轉換前數據:{d},轉換前的數據類型:{type(d)},轉換后的數據類型:{type(datetime.strptime(d,'%Y-%m-%d'))}")
輸出結果:
轉換前數據:1980-12-17,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-02-20,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-02-22,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-04-02,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-09-28,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-05-01,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-06-09,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1987-04-19,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-11-17,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-09-08,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1987-05-23,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-12-03,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1981-12-03,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
轉換前數據:1982-01-23,轉換前的數據類型:<class 'str'>,轉換后的數據類型:<class 'datetime.datetime'>
我們發現,從csv文件中讀取的數據類型為str類型,通過datetime.strptime()轉換后變為了datetime.datetime類型。也就是將字符串轉換為了時間類型。
注意:strftime() 可以將 datetime 類型轉換為字符串類型,恰好與 strptime() 相反。
import pandas as pd
from datetime import datetime
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")date_str =empdata.loc[:,'HIREDATE']
for d in date_str:print(f"轉換前格式:{d},轉換后的格式:{datetime.strftime(datetime.strptime(d,'%Y-%m-%d'),'%Y.%m.%d %H:%M:%S')}")
運行結果:
轉換前格式:1980-12-17,轉換后的格式:1980.12.17 00:00:00
轉換前格式:1981-02-20,轉換后的格式:1981.02.20 00:00:00
轉換前格式:1981-02-22,轉換后的格式:1981.02.22 00:00:00
轉換前格式:1981-04-02,轉換后的格式:1981.04.02 00:00:00
轉換前格式:1981-09-28,轉換后的格式:1981.09.28 00:00:00
轉換前格式:1981-05-01,轉換后的格式:1981.05.01 00:00:00
轉換前格式:1981-06-09,轉換后的格式:1981.06.09 00:00:00
轉換前格式:1987-04-19,轉換后的格式:1987.04.19 00:00:00
轉換前格式:1981-11-17,轉換后的格式:1981.11.17 00:00:00
轉換前格式:1981-09-08,轉換后的格式:1981.09.08 00:00:00
轉換前格式:1987-05-23,轉換后的格式:1987.05.23 00:00:00
轉換前格式:1981-12-03,轉換后的格式:1981.12.03 00:00:00
轉換前格式:1981-12-03,轉換后的格式:1981.12.03 00:00:00
轉換前格式:1982-01-23,轉換后的格式:1982.01.23 00:00:00
Pandas處理
除了使用 Python 內置的 strptime() 方法外,你還可以使用 Pandas 模塊的 pd.to_datetime() 和 pd.DatetimeIndex() 進行轉換。
1) to_datetime()
通過 to_datetime() 直接轉換為 datetime 類型
import pandas as pd
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")date_str =empdata.loc[:,'HIREDATE']
date_time = pd.to_datetime(date_str)
print(date_time)
輸出結果:
0 1980-12-17
1 1981-02-20
2 1981-02-22
3 1981-04-02
4 1981-09-28
5 1981-05-01
6 1981-06-09
7 1987-04-19
8 1981-11-17
9 1981-09-08
10 1987-05-23
11 1981-12-03
12 1981-12-03
13 1982-01-23
Name: HIREDATE, dtype: datetime64[ns]
是不是比python中的strptime()更加好用呢?(_)
2) DatetimeIndex()
import pandas as pd
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")date_str =empdata.loc[:,'HIREDATE']
date_time = pd.DatetimeIndex(date_str)
print(date_time)
運行結果:
DatetimeIndex(['1980-12-17', '1981-02-20', '1981-02-22', '1981-04-02','1981-09-28', '1981-05-01', '1981-06-09', '1987-04-19','1981-11-17', '1981-09-08', '1987-05-23', '1981-12-03','1981-12-03', '1982-01-23'],dtype='datetime64[ns]', name='HIREDATE', freq=None)
使用 Datetimeindex() 函數設置時間序,示例如下:
import pandas as pd
import numpy as np
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")date_str =empdata.loc[:,'HIREDATE']
date_time = pd.DatetimeIndex(date_str)df = pd.Series(np.random.randn(14),index = date_time)
print(df)
輸出結果:
1980-12-17 -0.118801
1981-02-20 0.049266
1981-02-22 -0.680420
1981-04-02 0.443656
1981-09-28 0.685218
1981-05-01 2.269103
1981-06-09 -0.704363
1987-04-19 -0.256806
1981-11-17 -0.855622
1981-09-08 -1.782622
1987-05-23 1.270465
1981-12-03 -1.282576
1981-12-03 0.710341
1982-01-23 0.545944
dtype: float64