本文同步发表于小弟自架网站:微确幸资讯站
来源:读取covid-19确诊名单(姓名源自于中文姓名产生器),居隔日期均为杜撰。
from io import StringIOimport pandas as pdimport datetimedata = """姓名居隔开始日居隔结束日李勋火2023/3/52023/3/10张博旭2023/2/282023/3/5林美宏2023/3/32023/3/8胡纪幸2023/3/42023/3/9赵百恆2023/3/52023/3/10张书其2023/3/52023/3/10林凯翔2023/3/22023/3/7张文妏2023/3/22023/3/7陈俊彦2023/3/62023/3/11黄彦菁2023/3/42023/3/9雷育萱2023/3/72023/3/12林俊合2023/3/82023/3/13"""df = pd.read_csv(StringIO(data), delim_whitespace=True)df
目标:筛选出「居隔结束日」大于等于程式执行当天(2023-03-10)的人。
# 首先确认一下df['居隔结束日']的资料型态df['居隔开始日'].head(3)
执行结果如下,居隔结束日的资料型态为object。
0 2023/3/101 2023/3/52 2023/3/8Name: 居隔结束日, 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-101 2023-03-052 2023-03-08Name: 居隔结束日, 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-062023-03-1110雷育萱2023-03-072023-03-1211林俊合2023-03-082023-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.datedf_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-110 2023-03-101 2023-03-052 2023-03-08Name: 居隔结束日, dtype: object
df_2[df_2['居隔结束日'].ge(today)]
执行后就能将2023-03-10的人也筛选出来了!!