Python学习笔记: Pandas 依程式执行当下日期筛选资料

本文同步发表于小弟自架网站:微确幸资讯站

来源:读取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

http://img2.58codes.com/2024/20122335mDlNMBzQYF.jpg

目标:筛选出「居隔结束日」大于等于程式执行当天(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的人也筛选出来了!!
http://img2.58codes.com/2024/20122335s9yZP60csv.jpg


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章