Pandas_實現數字順序填充、指定值交替填充、日期順序填充(按日、月、年)
阿新 • • 發佈:2019-05-02
set out 報錯 png date 讓我 div 增加 技術
excel表的數據情況如下:下面數據區域的左邊和上邊都是空,這會導致我們讀取近pathon裏時,結構不是我們要的,需要用到skiprow和usecols來控制我們想要讀取的區域
整合:
import pandas as pd from datetime import date,timedelta books = pd.read_excel("../004/Books.xlsx",skiprows=3,usecols="C:F",dtype={"ID":str,"InStore":str,"Date":str}) # books.dtypes # 設置個起始日期 start = date(2019,1,1)# 設置個月份遞增的函數 def add_month(d,md): y = md // 12 m = d.month + md % 12 if m !=12: y += m // 12 m = m % 12 return date(d.year + y, m,d.day) for i in books.index: books["ID"].at[i]=i+1 books["InStore"].at[i]="YES" if i % 2 ==0 else "ON" # books["Date"].at[i]=start + timedelta(days=i) # 逐日增加# books["Date"].at[i]=add_month(start,i) # 逐月增加 books["Date"].at[i]=date(start.year+i,start.month,start.day) # 逐年增加 print(books) # 設置索引為ID列 books.set_index("ID",inplace=True) # 將設置好的數據存入名為:out_books的excel表裏 books.to_excel("out_books.xlsx") print("Done!")
結果圖:
分解:
import pandas as pd # skiprows=3 表示跳過上面的3行後再讀取 # usecols="C:F" 表示讀取excel裏C到F的列,如果時要跳著選擇列可以寫成:usecols="C,D,E,F" books = pd.read_excel("../004/Books.xlsx",skiprows=3,usecols="C:F",dtype={"ID":str,"InStore":str,"Date":str}) print(books.head())
一、為ID列自動填充1-20的數字 :
# ID列的數據都是NaN,NaN的類型是浮點數,如果不先轉換ID列的數據類型,直接給ID填充賦值後的數據也是浮點類型,因此我們需要在導入數據時就把 # 字段的類型先做轉換,但是因為NaN的數據不讓我們轉為int,會報錯,我們可以用個小技巧,把NaN的列先轉換為str類型,這樣一會就可以正常賦值 print("=====>",books["ID"].dtypes) # 這句是為了查看ID的數據類型 # 下面開始給指定列賦值 # 方法1: for i in books.index: books["ID"].at[i]=i+1 # 方法2: for i in range(0,20): # books["ID"].at[i]=i+1 這是先找出指定的那一列(Series),再找到要替換的那一行 books.at[i,"ID"]=i+1 # 這是直接在二維表(DataFrame)裏指定第幾行,第幾列要替換 print(books) print("======>",books.dtypes) # 這句是查看books數據裏所有列的數據類型
結果圖:
二、給 InStore 列 替換式的填充 YES 和 NO :
for i in books.index: books["InStore"].at[i]="YES" if i % 2 ==0 else "NO" print(books.head())
結果圖:
三、 按日期填充數據:
# 先導入datetime庫 from datetime import date,timedelta # 先設置一個起始日期 start = date(2019,1,1)
1、給 Date 列的日期逐日增加填充
# 按日給Date列填充時間 for i in books.index: books["Date"].at[i]=start+timedelta(days=i) # 用 timedelta(days=i) 實現按日填充 # books["Date"].at[i]=date(start.year,start.month,start.day+i) 也可以這麽寫來實現逐日填充 print(books)
結果圖:
2、給 Date 列的日期按年填充 :
for i in books.index: books["Date"].at[i]=date(start.year+i,start.month,start.day) print(books.head())
結果圖:
3、給 Date 列的日期按月份填充,需要設置個函數實現:
# d:傳入的起始日期 # md: 要增加多少個月 def add_month(d,md): y = md //12 # 要增加的月份能換算成多少年 m = d.month + md % 12 # md % 12:要增加的月份除以12後的余數(即剩下多少個月) if m !=12: y += m // 12 m = m % 12 return date(d.year+y,m,d.day)
# 用for 循環填充 for i in books.index: books["Date"].at[i]=add_month(start,i) print(books)
結果圖:
Pandas_實現數字順序填充、指定值交替填充、日期順序填充(按日、月、年)