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")