white samsung charger on white textile

Python學習筆記: Pandas 依程式執行當下日期篩選資料

來源:讀取covid-19確診名單(姓名源自於中文姓名產生器),居隔日期均為杜撰。

from io import StringIO
import pandas as pd
import datetime

data = """
姓名	居隔開始日	居隔結束日
李勳火	2023/3/5	2023/3/10
張博旭	2023/2/28	2023/3/5
林美宏	2023/3/3	2023/3/8
胡紀幸	2023/3/4	2023/3/9
趙百恆	2023/3/5	2023/3/10
張書其	2023/3/5	2023/3/10
林凱翔	2023/3/2	2023/3/7
張文妏	2023/3/2	2023/3/7
陳俊彥	2023/3/6	2023/3/11
黃彥菁	2023/3/4	2023/3/9
雷育萱	2023/3/7	2023/3/12
林俊合	2023/3/8	2023/3/13
"""

df = pd.read_csv(StringIO(data), delim_whitespace=True)
df

目標:篩選出「居隔結束日」大於等於程式執行當天(2023-03-10)的人。

# 首先確認一下df['居隔結束日']的資料型態
df['居隔開始日'].head(3)

執行結果如下,居隔結束日的資料型態為object。

# 先複製一個df_1來操作
df_1 = df.copy()

# 將居隔開始日和結束日轉成datetime的資料型態
df_1['居隔開始日'] = pd.to_datetime(df_1['居隔開始日'])
df_1['居隔結束日'] = pd.to_datetime(df_1['居隔結束日'])

# 確認一下df_1['居隔結束日']的資料型態
df_1['居隔結束日'].head(3)

執行後,確認「居隔結束日」資料型態確認已經是datetime64。

# 取得執行程式當天日期含時間
today_time = datetime.datetime.today()
yesterday_time = today_time - datetime.timedelta(days=1)
tomorrow_time = today_time + datetime.timedelta(days=1)

print(f'今天是{today_time}')
print(f'昨天是{yesterday_time}')
print(f'明天是{tomorrow_time}')

本範例執行當下所取得「今天」」、「昨天」、「明天」的日期:

如果直接執行以下的程式,並不能符合目標需求(居隔結束日期>=2023-03-10)

# ge為greater than or equal to,也就是大於等於
df_1[df_1['居隔結束日'].ge(today_time)]

結果不符需求,因為不含居隔結束日為2023-03-10的人:

原因在於所有讀進來的資料時間都是00:00:00,

所以和today_time(時間為22:23:09.904050)比較之後,

不在大於等於的區間。

要正確只比較日期,做法如下:

# 先複製一個df_2來操作
df_2 = df.copy()

# 將居隔開始日和結束日轉成datetime的資料型態後,再以dt.date只取日期
df_2['居隔開始日'] = pd.to_datetime(df_2['居隔開始日']).dt.date
df_2['居隔結束日'] = pd.to_datetime(df_2['居隔結束日']).dt.date

# 取得執行程式當天日期不含時間
today = datetime.date.today()
yesterday = today - datetime.timedelta(days=1)
tomorrow = today + datetime.timedelta(days=1)

print(f'今天是{today}')
print(f'昨天是{yesterday}')
print(f'明天是{tomorrow}')
df_2['居隔結束日'].head(3)

執行結果如下:

df_2[df_2['居隔結束日'].ge(today)]

發佈留言

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