iT邦幫忙

1

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

  • 分享至 

  • xImage
  •  

本文同步發表於小弟自架網站:微確幸資訊站

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

https://ithelp.ithome.com.tw/upload/images/20230310/20122335mDlNMBzQYF.jpg

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

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

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

0    2023/3/10
1     2023/3/5
2     2023/3/8
Name: 居隔結束日, dtype: 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。

0   2023-03-10
1   2023-03-05
2   2023-03-08
Name: 居隔結束日, dtype: datetime64[ns]
# 取得執行程式當天日期含時間
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 22:23:09.904050
昨天是2023-03-09 22:23:09.904050
明天是2023-03-11 22:23:09.904050

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

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

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

姓名	居隔開始日	居隔結束日
8	陳俊彥	2023-03-06	2023-03-11
10	雷育萱	2023-03-07	2023-03-12
11	林俊合	2023-03-08	2023-03-13

原因在於所有讀進來的資料時間都是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)

執行結果如下:

今天是2023-03-10
昨天是2023-03-09
明天是2023-03-11
0    2023-03-10
1    2023-03-05
2    2023-03-08
Name: 居隔結束日, dtype: object
df_2[df_2['居隔結束日'].ge(today)]

執行後就能將2023-03-10的人也篩選出來了!!
https://ithelp.ithome.com.tw/upload/images/20230310/20122335s9yZP60csv.jpg


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言