求助:Python实现患者预约提前2周2天邮件提醒的日期筛选
解决预约邮件提醒的日期筛选问题
没问题,我来帮你搞定这个日期筛选的核心逻辑!其实关键在于把字符串格式的日期转换成可计算的日期对象,然后通过时间差来判断哪些患者需要触发提醒。下面一步步给你拆解:
第一步:统一日期格式,转换成可计算的对象
首先,你需要把字典里的appointment_date字段(不管是字符串还是其他格式)转换成Python的datetime或date对象——因为字符串没法直接做日期加减运算。假设你的日期是YYYY-MM-DD这种ISO格式,代码可以这么写:
from datetime import datetime, timedelta # 示例:模拟你的results列表 results = [ {"patient_id": 1, "appointment_date": "2024-06-20", "name": "张三"}, {"patient_id": 2, "appointment_date": "2024-05-30", "name": "李四"}, # 剩下48个患者... ]
第二步:计算提醒触发的时间阈值
你需要提前2周零2天发送提醒,也就是**预约日期减去16天(14+2)**的那天,就是你需要发送邮件的时间。我们可以用timedelta来计算这个时间差:
# 获取当前日期(如果需要精确到时间,就用datetime.now(),这里先只取日期部分) today = datetime.today().date() # 定义提醒间隔:2周零2天 reminder_interval = timedelta(weeks=2, days=2)
第三步:筛选符合条件的患者
遍历你的results列表,逐个计算每个患者的预约日期和当前日期的差值,判断是否刚好到达提醒时间:
patients_to_remind = [] for patient in results: # 将字符串日期转成date对象(如果你的日期带时间,就用'%Y-%m-%d %H:%M:%S'格式) appt_date = datetime.strptime(patient["appointment_date"], "%Y-%m-%d").date() # 计算距离预约还有多少天 days_left = (appt_date - today).days # 关键判断:刚好提前16天的时候触发提醒 if days_left == 16: patients_to_remind.append(patient) # 现在patients_to_remind里就是需要发邮件的患者啦 print(f"需要发送提醒的患者数量:{len(patients_to_remind)}")
一些需要注意的细节
- 时区问题:如果你的系统用UTC时间存储预约日期,记得用
datetime.now(timezone.utc)来获取当前UTC时间,避免时区偏差导致提醒发送错误。 - 带时间的预约:如果预约日期精确到时分秒,建议用
datetime对象而不是date来计算,比如判断「预约时间减去16天的时间是否在今天的范围内」,避免因为时间差导致提前或延后发送。 - 异常处理:如果存在格式不规范的日期字符串,可以加个
try-except块跳过错误数据,避免脚本崩溃:try: appt_date = datetime.strptime(patient["appointment_date"], "%Y-%m-%d").date() except ValueError: print(f"患者{patient['patient_id']}的预约日期格式错误,跳过") continue
内容的提问来源于stack exchange,提问作者zx123
相关产品推荐
相关产品推荐

