在R语言中检测两个日期变量是否涵盖任意年份的6月30日
判断日期区间是否包含任意年份6月30日的通用方法
核心逻辑
一条记录符合条件的情况分为两种:
- 日期区间跨至少两个年份:这种情况必然包含其中某一年的6月30日(比如2021-02到2022-01,包含2021年6月30日)
- 日期区间在同一年份:需要检查当年的6月30日是否落在
start_date和end_date之间
Python(Pandas)实现
先将日期字段转为datetime类型,再通过遍历区间覆盖的年份判断是否存在符合条件的6月30日:
import pandas as pd # 示例数据集 data = pd.DataFrame({ 'start_date': ['02-25-2021', '07-02-2015', '01-01-2020', '06-28-2023', '12-01-2022'], 'end_date': ['01-12-2022', '08-25-2015', '12-31-2020', '07-05-2023', '06-30-2023'] }) # 转换日期格式 data['start_date'] = pd.to_datetime(data['start_date'], format='%m-%d-%Y') data['end_date'] = pd.to_datetime(data['end_date'], format='%m-%d-%Y') # 定义判断函数 def has_june30(row): start_year = row['start_date'].year end_year = row['end_date'].year # 遍历区间覆盖的所有年份 for year in range(start_year, end_year + 1): june30 = pd.Timestamp(f"{year}-06-30") if row['start_date'] <= june30 <= row['end_date']: return True return False # 生成结果列 data['includes_june30'] = data.apply(has_june30, axis=1) print(data)
SQL实现(以MySQL为例)
通过年份对比简化判断逻辑,无需手动指定年份范围:
SELECT start_date, end_date, CASE -- 跨年度直接符合条件 WHEN YEAR(end_date) > YEAR(start_date) THEN TRUE -- 同年度时检查当年6月30日是否在区间内 WHEN YEAR(end_date) = YEAR(start_date) THEN STR_TO_DATE(CONCAT(YEAR(start_date), '-06-30'), '%Y-%m-%d') BETWEEN start_date AND end_date ELSE FALSE END AS includes_june30 FROM your_table;
内容的提问来源于stack exchange,提问作者daltoncito5034
相关产品推荐
相关产品推荐

