1. 程式人生 > >Pandas_實現數字順序填充、指定值交替填充、日期順序填充(按日、月、年)

Pandas_實現數字順序填充、指定值交替填充、日期順序填充(按日、月、年)

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_實現數字順序填充、指定值交替填充、日期順序填充(按日、月、年)