pandas 按日期范圍篩選數據的實現

pandas 是 python 中一個功能強大的庫,這裡就不再復述瞭,簡單介紹下用日期范圍篩選 pandas 數據。

日期轉換

用來篩選的列是 date 類型,所以這裡要把要篩選的日期范圍從字符串轉成 date 類型

比如我的數據包含列名為 trade_date,從 20050101 – 20190926 的數據,我要篩選出 20050606 – 20071016 的數據,那麼,先如下轉換數據類型:

s_date = datetime.datetime.strptime('20050606', '%Y%m%d').date()
e_date = datetime.datetime.strptime('20071016', '%Y%m%d').date()

數據篩選

非常簡單,一行代碼就搞定瞭:

df = df[(df['tra_date'] >= s_date) & (df['tra_date'] <= e_date)]

註意事項

  • 多個篩選條件並存時,不能用 and 連接,需要用單個 & 符號。
  • s_date <= df[‘trade_date’] <= e_date 等同於 and

pandas提取某段時間范圍數據的五種方法

import pandas as pd
 
#讀取文件
df = pd.read_csv('./TianQi.csv')
 
#獲取九月份數據的幾種方法
#方法一  使用行索引切片,['2019/9/1':'2019/9/30'],缺點是要求日期必須是連續的。為瞭方便查看取前5條,以下其他方法均取前5條,由於未進行排序,順序會有差異
df.set_index('日期',inplace=True)
print(df['2019/9/1':'2019/9/30'].head())  #或者print(df.loc['2019/9/1':'2019/9/30',:]) 
'''
打印:
     最高溫度 最低溫度  天氣  風向 風級 空氣質量
日期                  
2019/9/1 33℃ 19℃ 多雲~晴 西南風 2級  良
2019/9/2 34℃ 20℃   晴  南風 2級  良
2019/9/3 33℃ 20℃   晴 東南風 2級  良
2019/9/7 34℃ 21℃   晴 西南風 2級  良
2019/9/8 35℃ 22℃ 晴~多雲 東北風 2級  良
'''
 
#方法二  利用列表生成式和startwith('2019/9')生成bool列表,缺點,比較麻煩。
print(df.loc[[True if i.startswith('2019/9') else False for i in df.index.tolist()],:].head())
'''
打印:
     最高溫度 最低溫度  天氣  風向 風級 空氣質量
日期                  
2019/9/4 32℃ 19℃   晴 東南風 2級  良
2019/9/5 33℃ 20℃   晴 東南風 2級  良
2019/9/6 33℃ 20℃   晴 東南風 1級  良
2019/9/1 33℃ 19℃ 多雲~晴 西南風 2級  良
2019/9/2 34℃ 20℃   晴  南風 2級  良
'''
 
#方法三  利用pandas的str和startswith('2019/9')|contains('2019/9')。
df1 = pd.read_csv('./TianQi.csv')
print(df1[df1['日期'].str.startswith('2019/9')].head())
'''
打印:
     日期 最高溫度 最低溫度  天氣  風向 風級 空氣質量
243 2019/9/4 32℃ 19℃   晴 東南風 2級  良
244 2019/9/5 33℃ 20℃   晴 東南風 2級  良
245 2019/9/6 33℃ 20℃   晴 東南風 1級  良
246 2019/9/1 33℃ 19℃ 多雲~晴 西南風 2級  良
247 2019/9/2 34℃ 20℃   晴  南風 2級  良
'''
 
#方法四  講日期轉換成datetime類型
df1['日期'] = pd.to_datetime(df1['日期'])
df1.set_index('日期',inplace=True,drop=True)
#print(df1['2019'])  #取2019年數據,或者df.loc['2019']
print(df1['2019/09'].head())  
'''
 取201909月數據,其他變形寫法df['2019-9'] df['2019-09'] df['2019/9'] df.loc['2019-9',:] df.loc['2019-09',:] df.loc['2019/09',:] df.loc['2019/9',:]
打印:
      最高溫度 最低溫度  天氣  風向 風級 空氣質量
日期                   
2019-09-04 32℃ 19℃   晴 東南風 2級  良
2019-09-05 33℃ 20℃   晴 東南風 2級  良
2019-09-06 33℃ 20℃   晴 東南風 1級  良
2019-09-01 33℃ 19℃ 多雲~晴 西南風 2級  良
2019-09-02 34℃ 20℃   晴  南風 2級  良
'''
#註意如果要獲取某一天的數據,則必須使用切片,比如df['2019/9/1':'2019/9/1'] 
'''
獲取一段時間
df1.truncate(after = '2019-9-01') # 返回 after 以前的數據
df1.truncate(before = '2019-9-01') # 返回 before 以後的數據
df1['20190901':'2019/9/10']
'''
 
#方法五  #讀取文件時,通過parse_dates=['日期'],將日期轉化為datetime類型,相當於 pd.to_datetime。同時可以使用index_col將那一列作為的行索引,相當有set_index。
df2 = pd.read_csv('./TianQi.csv',parse_dates=['日期'])
df2['年'] = df2['日期'].dt.year
df2['月'] = df2['日期'].dt.month
qstr = "年=='2019' and 月=='9'"
print(df2.query(qstr).head())
'''
打印:
      日期 最高溫度 最低溫度  天氣  風向 風級 空氣質量   年 月
243 2019-09-04 32℃ 19℃   晴 東南風 2級  良 2019 9
244 2019-09-05 33℃ 20℃   晴 東南風 2級  良 2019 9
245 2019-09-06 33℃ 20℃   晴 東南風 1級  良 2019 9
246 2019-09-01 33℃ 19℃ 多雲~晴 西南風 2級  良 2019 9
247 2019-09-02 34℃ 20℃   晴  南風 2級  良 2019 9
'''
 
'''
dt的其他常用屬性和方法如下:
df['日期'].dt.day  # 提取日期
df['日期'].dt.year # 提取年份
df['日期'].dt.hour # 提取小時
df['日期'].dt.minute # 提取分鐘
df['日期'].dt.second # 提取秒
df['日期'].dt.week # 一年中的第幾周
df['日期'].dt.weekday # 返回一周中的星期幾,0代表星期一,6代表星期天
df['日期'].dt.dayofyear # 返回一年的第幾天
df['日期'].dt.quarter # 得到每個日期分別是第幾個季度。
df['日期'].dt.is_month_start # 判斷日期是否是每月的第一天
df['日期'].dt.is_month_end # 判斷日期是否是每月的最後一天
df['日期'].dt.is_leap_year # 判斷是否是閏年
df['日期'].dt.month_name() # 返回月份的英文名稱
df['日期'].dt.to_period('Q') # M 表示月份,Q 表示季度,A 表示年度,D 表示按天
df['日期'].dt.weekday_name # 返回星期幾的英文 由於pandas版本問題,改變pandas版本在cmd中輸入:pip install --upgrade pandas==0.25.3
Series.dt.normalize() # 函數將給定系列對象中的時間轉換為午夜。
'''

到此這篇關於pandas 按日期范圍篩選數據的實現的文章就介紹到這瞭,更多相關pandas 日期范圍篩選內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: