來源:讀取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)]