Pandas處理日期數據的常見操作集錦
- 數據讀取及整理
- 獲取某個日期之前/後或時間區間的數據
- python 獲取當前時間及前一天時間
- pandas的日期時間間隔運算選取指定時間範圍內/外的數據
- 利用pandas計算DataFrame兩列日期的間隔小時數
- numpy中-Datetimes and Timedeltas的使用
- 日期格式轉換
- 日期的計算
數據讀取及整理
將數據類型轉換爲日期類型
df['date'] = pd.to_datetime(df['date'])
將date設置爲index
df = df.set_index('date')
獲取某年的數據
print(df['2010'].head())
獲取某月的數據
print(df['2013-11'].head())
提取全日期字段中的日期和時間項
data4["訂單生成時間"] = pd.to_datetime(data4["訂單生成時間"])
data4["時間"] = data4["訂單生成時間"].dt.hour #提取時間
data4["日期"] = data4["訂單生成時間"].dt.date #提取日期
獲取某個日期之前/後或時間區間的數據
dataframe的.truncate()函數可以截取某個時期之前或之後的數據,或者某個時間區間的數據,進行統計分析。
注意事項:
使用.truncate()函數對df進行數據集截取,遇到截取數據不符合預期,且若時間序列無序會拋出異常
解決措施:
在使用.truncate()函數對df進行數據集截取之前,需要先使用df=df.sort_values(‘date’)‘date’列按時間先後進行排序,然後使用df = df.set_index('date'),將“date”設置爲index,最後再使用df_last=df.truncate(after=‘2019-05-22 16:00:00’)提取指定時間節點之前的數據。
函數語法:
DataFrame.truncate(before=None, after=None, axis=None, copy=True)
參數說明:
before:取值範圍:date,string,int,是指截斷此索引值之前的所有行
after:取值範圍:date,string,int,是指截斷此索引值後的所有行
axis:取值範圍:{0或’index’,1或’columns’}(可選),是指軸截斷。 默認情況截斷索引(行)。
copy:取值範圍:boolean,默認爲True,返回截斷部分的副本
常見用法:
- 獲取2014年以後的數據
print(df.truncate(before='2014').head())
獲取2013-11月之前的數據,用after
print(df.truncate(after='2013-11').head())
獲取2016-02月以後的數據,用before
print(df.truncate(before='2016-02').head())
獲取2019-05-22日16:00:00時之前的數據
df=data.truncate(after='2019-05-22 16:00:00')
獲取指定時間區間的數據
df=df['2016-02-2':'2016-02-10']
獲取指定時間區間的數據
df=df['2016-02-2':'2016-02-10']
python 獲取當前時間及前一天時間
import datetime
from pandas.tseries.offsets import Day
now_time =datetime.datetime.now()#獲取當前時間
yes_time = (now_time -1*Day()).strftime('%Y-%m-%d')#格式化
print(yes_time)
pandas的日期時間間隔運算
import datetime
from datetime import timedelta
df_189[‘訂單生成日期’]=pd.to_datetime(df_189[‘訂單生成日期’]) #修改“訂單生成時間”的數據類型
df_189[‘訂單生成日期’]+timedelta(days=1) #後一天的日期
df_189[‘訂單生成日期’]-timedelta(days=3) #前3天的日期
選取指定時間範圍內/外的數據
##提取3日前日期和7日前日期
now_time =datetime.datetime.now()#獲取當前時間
yes_time_7 = (now_time -7*Day()).strftime('%Y-%m-%d')#格式化
yes_time_3= (now_time-3*Day()).strftime("%Y-%m-%d")
print(yes_time_7)
print('='*50)
print(yes_time_3)df_189['訂單生成日期']=pd.to_datetime(df_189['訂單生成日期']) #修改“訂單生成時間”的數據類型
df_189_7= df_189[df_189['訂單生成日期']==yes_time_7]
df_189_3= df_189[df_189['訂單生成日期']==yes_time_3]
print(df_189_7.info()) #選取該錯誤數據對應的時間範圍外的數據,多個條件時 '|'代表'或','&'代表'且' 或者
a= df_189[df_189['訂單生成日期']=='2019-06-23'] #篩選2019-06-23的數據
利用pandas計算DataFrame兩列日期的間隔小時數
import pandas as pd
#方法一:
#先利用to_datetime轉換爲時間格式,tm列的數據形式爲'yyyy-MM-dd HH:mm:ss'
df['tm_1'] = pd.to_datetime(df['tm_1'])
df['tm_2'] = pd.to_datetime(df['tm_2'])
#利用".dt.seconds"轉換爲秒,除以相對於的間隔數得到分鐘、小時等
df['diff_time'] = (df['tm_1'] - df['tm_2']).dt.seconds/60
#利用round函數可進行四捨五入
df['diff_time'] = round(df['diff_time'])
#方法二,日期相減變爲小時;變爲天的話將h替換爲D即可:
df['diff_time'] = (df['tm_1'] - df['tm_2']).values/np.timedelta64(1, 'h')
#Dataframe中的時間是不能直接進行相加減的,所以需要先用pandas的to_datetime()方法,轉化成時間格式進行加減,然後再轉換成df格式
#delta=df1['Time_end']-df1['Time_start'] #直接報錯TypeError: unsupported operand type(s) for -: 'str' and 'str'
#日期相減變爲小時;變爲天的話將h替換爲D即可:
sf_df['交易週期']=pd.DataFrame((pd.to_datetime(sf_df['交易完成時間'])-pd.to_datetime(sf_df['訂單生成時間'])).values/np.timedelta64(1,'h'))
numpy中-Datetimes and Timedeltas的使用日期格式轉換
在numpy中,使用np.datetime64('2017-08' , 'D')可以很方便的將字符串轉換成日期類型。
import numpy as np
np.datetime64('2017-08-06') #精確到日
>>>
numpy.datetime64('2017-08-06')
np.datetime64('2018-08') #精確到月
>>>
numpy.datetime64('2018-08')
# 通過參數,強制將數據格式轉爲我們想要的粒度
np.datetime64('2017-08','D') #轉化到日
>>>
numpy.datetime64('2017-08-01')
np.datetime64('2017-08','Y') #轉化到年
>>>
numpy.datetime64('2017')
a = np.array(['2017-07-01','2017-07-15','2017-08-01'],dtype = np.datetime64) #列表日期
a
>>>
array(['2017-07-01', '2017-07-15', '2017-08-01'], dtype='datetime64[D]')
# 我們也可以使用arange函數初始化數組
b = np.arange('2017-08-01','2017-09-01',dtype = np.datetime64)
b
>>>
array(['2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04',
'2017-08-05', '2017-08-06', '2017-08-07', '2017-08-08',
'2017-08-09', '2017-08-10', '2017-08-11', '2017-08-12',
'2017-08-13', '2017-08-14', '2017-08-15', '2017-08-16',
'2017-08-17', '2017-08-18', '2017-08-19', '2017-08-20',
'2017-08-21', '2017-08-22', '2017-08-23', '2017-08-24',
'2017-08-25', '2017-08-26', '2017-08-27', '2017-08-28',
'2017-08-29', '2017-08-30', '2017-08-31'], dtype='datetime64[D]')
日期的計算
在numpy中,我們可以進行簡單的日期計算
# 兩個日期相減,會得到相差的天數
np.datetime64('2017-08-03') - np.datetime64('2017-07-15')
>>>
numpy.timedelta64(19,'D')
# 這裏日期可以直接減去對應的天數
np.datetime64('2017-08-03') - np.timedelta64(20,'D')
>>>
#這裏日期的粒度必須保證一樣,一個是D,一個是M,是不可以相減的
np.datetime64('2017-08-03') - np.timedelta64(1,'M')
>>>
TypeError: Cannot get a common metadata divisor for NumPy datetime metadata [D] and [M] because they have incompatible nonlinear base time units
np.datetime64('2017-08') - np.timedelta64(1,'M')
>>>
numpy.datetime64('2017-07')
(np.datetime64('2014-10-30 23:00:00') - np.datetime64('2014-10-21 00:00:00')) #按秒計時
(np.datetime64('2014-10-30 23:00:00') - np.datetime64('2014-10-21 00:00:00'))/np.timedelta64(1, 'h') #計算時間差,並轉爲小時
>>>
239.0
#計算終止時間-初試時間,轉爲小時格式,最後格式設置爲整型。np.floor((x - start_hour) / np.timedelta64(1, 'h')).astype(np.uint16)
np.floor((np.datetime64('2014-10-30 23:00:00') -
np.datetime64('2014-10-21 00:00:00'))/np.timedelta64(1, 'h')).astype(np.uint16)
>>>
239