Pandas庫是處理時間序列的利器,pandas有着強大的日期數據處理功能,可以按日期篩選數據、按日期顯示數據、按日期統計數據。
pandas的實際類型主要分為:
- timestamp(時間戳)
- period(時期)
- timedelta(時間間隔)
常用的日期處理函數有:
- pd.to_datetime()
- pd.to_period()
- pd.date_range()
- pd.period_range
- resample
一、定義時間格式
1. pd.Timestamp()、pd.Timedelta()
(1)Timestamp時間戳
#定義timestamp t1=pd.Timestamp('2019-01-10') t2=pd.Timestamp('2018-12-10') print(f't1= {t1}') print(f't2= {t2}') print(f't1與t2時間間隔:{(t1-t2).days}天')
#獲取當前時間 now=pd.datetime.now() print(now) print(now.strftime('%Y-%m-%d'))
(2)Timedelta:實現datetime加減
對日期和時間進行加減實際上就是把datetime往后或往前計算,得到新的datetime。加減可以直接用+
和-
運算符,不過需要導入timedelta
這個類:
#時間間隔 pd.Timedelta(days=5, minutes=50, seconds=20, milliseconds=10, microseconds=10, nanoseconds=10)
#計算當前時間往后100天的日期 dt=now+pd.Timedelta(days=100) #只顯示年月日 dt.strftime('%Y-%m-%d')
2. pd.Period()
#定義時期period,默認是A-DEC,代表年份,以12月作為最后一個月 p1=pd.Period('2019') p2=pd.Period('2018') print(f'p1={p1}年') print(f'p2={p2}年') print(f'p1和p2間隔{p1-p2}年') #可以直接+、-整數(代表年) print(f'十年前是{p1-10}年')
#通過asfreq轉換時期頻率 #以第一個月算,p1前面已賦值為2019年 p1.asfreq('M','start')
#以最后一個月算 p1.asfreq('M','end')
#財報季度 p=pd.Period('2019Q3',freq='Q-DEC') #起始月日 print(p.asfreq('D','start')) #結束月日 print(p.asfreq('D','end'))
3. pd.to_timestamp()
時期轉為時間戳
#時間戳和時期相互轉換 print(p1.to_timestamp(how='end')) print(p1.to_timestamp(how='start'))
4. pd.to_period()
時間戳轉為時期
#t1前面賦值為'2019-1-10' #轉換為月時期 print(t1.to_period('M')) #轉換為日時期 print(t1.to_period('D')) print(t1.to_period('W'))
5. pd.to_datetime()
pandas.to_datetime(arg,errors ='raise',utc = None,format = None,unit = None )
(1)獲取指定的時間和日期
當數據很多,且日期格式不標准時的時候,可以使用to_datetime,將DataFrame中的時間轉換成統一標准。
例如:df[''date]數據類型為“object”,通過pd.to_datetime將該列數據轉換為時間類型,即datetime。
df['date_formatted']=pd.to_datetime(df['date'],format='%Y-%m-%d')
常用時間:
(2)to_datetime可以處理那些被認為是缺失值的值(None、空字符串)
(3)將Str和Unicode轉化為時間格式
6. strptime和strftime
(1)字符串轉換成datetime格式: strptime
用戶輸入的日期和時間是字符串,要處理日期和時間,首先必須把str轉換為datetime。轉換方法是通過datetime.strptime()
實現,需要一個日期和時間的格式化字符串:
df_data1 = pd.DataFrame(columns=['date','values']) df_data1['date'] = ['2019-01-01','2019-01-02','2019-01-03','2019-01-04','2019-01-05'] df_data1['values'] = np.random.randn(5) df_data1
df_data1['date'] = df_data1['date'].map(lambda x:datetime.strptime(x,'%Y-%m-%d')) df_data1
注意轉換后的datetime是沒有時區信息的。
舉例:將分開的年月日時整合,並設置為索引
數據集:
from datetime import datetime # load data def parse(x): return datetime.strptime(x, '%Y %m %d %H') dataset = read_csv('raw.csv', parse_dates = [['year', 'month', 'day', 'hour']], index_col=0, date_parser=parse) dataset.drop('No', axis=1, inplace=True) # manually specify column names dataset.columns = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain'] dataset.index.name = 'date'
(2)datetime變回string格式: strftime
如果已經有了datetime對象,要把它格式化為字符串顯示給用戶,就需要轉換為str,轉換方法是通過strftime()
實現的,同樣需要一個日期和時間的格式化字符串:
#定義一個DataFrame格式的數據df_data df_data = pd.DataFrame(columns=['date','values']) df_data['date'] = pd.date_range('2019/01/01',periods=5) df_data['values'] = np.random.randn(5) df_data
用strftime把datetime格式的時間數據轉換成string
df_data['date'] = df_data['date'].apply(lambda x:x.strftime('%Y/%m')) #datetime格式轉成str
以下是時間格式定義
代碼 說明 %Y 4位數的年 %y 2位數的年 %m 2位數的月[01,12] %d 2位數的日[01,31] %H 時(24小時制)[00,23] %l 時(12小時制)[01,12] %M 2位數的分[00,59] %S 秒[00,61]有閏秒的存在 %w 用整數表示的星期幾[0(星期天),6] %F %Y-%m-%d簡寫形式例如,2017-06-27 %D %m/%d/%y簡寫形式
參考文獻: