實例練習


import pandas as pd
close_prices_df = pd.read_csv('close_prices.csv')  # 讀取收盤價資料
test_df = pd.read_csv('test.csv')  # 讀取除權息資料


因為除權息資料的除權息日期欄位為民國年,為了之後比對方便,我想轉成西元年,包裝成函式可以重複調用。
例如除權息日期的這個欄位:102年01月04日


def convert_to_gregorian(minguo_date): # 可以把民國年當變數傳到這個函式
    try: # 未執行之前不知道會不會有錯,所以用try
        # 將民國年的格式分割成年份和剩餘部分,但還不是正式的日期格式
        year_str, rest = minguo_date.split("年", 1)  # 用年作為分割符號,只分割一次
        year = int(year_str) + 1911  # 將民國年轉換為西元年,要先轉成int才能運算
        # 返回轉換後的日期字串,使用f-string比較方便
        return f"{year}年{rest}"  # 這時候從102年01月04日變成2013年01月04日
    
    except ValueError as e: # 有遇到無法轉換狀況的處理方式,避免程式直接崩潰
        # 給出錯誤提示信息,包含錯誤原因和出錯的日期字串
        print(f"Error: 無法解析日期 '{minguo_date}' - {e}")
        return minguo_date  # 返回原始值

在這裡多加了一個try…except用法,避免原始資料有怪資料,轉換過程中如果有像
一百零二年01月04日這種資料會顯示,並且先用原始值返回:

Error: 無法解析日期 ‘一百零二年01月04日’ – invalid literal for int() with base 10: ‘一百零二’

為什麼是ValueError? 這是其中一種發生錯誤的原因,寫不同使用情況的try…except有可能會用到不同的錯誤原因,Python 會有內建的,若有需要也可以自定義。

接著要把所有除權息的日期都轉成西元年,使用pandas的apply方法,可以遍歷series並且送到convert_to_gregorian這個函式裡當參數,最後指派回去原本的欄位。


test_df["除權息日期"] = test_df["除權息日期"].apply(convert_to_gregorian)
test_df["除權息日期"] = pd.to_datetime(test_df["除權息日期"], format="%Y年%m月%d日")
close_prices_df["收盤日期"] = pd.to_datetime(close_prices_df["收盤日期"], format="%Y-%m-%d")

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *