统计列表中落在DataFrame两日期列区间内的日期数量
问题:统计日期列表中落在DataFrame日期区间内的次数
现有一个包含Date1、Date2两列日期的DataFrame(命名为df),以及一个日期列表,需要统计该列表中每个日期落在df每一行Date1与Date2区间内的总次数,最终生成新增Count列的DataFrame(命名为df2)。
示例数据
原始DataFrame(df)
Date1 Date2 2022-09-01 2022-09-07 2022-09-10 2022-09-22 2022-09-06 2022-09-21 2022-09-17 2022-09-25 2022-06-30 2022-09-21
日期列表
['2022-09-16', '2022-07-01']
预期输出(df2)
Date1 Date2 Count 2022-09-01 2022-09-07 0 2022-09-10 2022-09-22 1 2022-09-06 2022-09-21 1 2022-09-17 2022-09-25 0 2022-06-30 2022-09-21 2
解决方案
步骤1:导入依赖并准备数据
先导入pandas库并构造示例数据:
import pandas as pd # 构造原始DataFrame data = { 'Date1': ['2022-09-01', '2022-09-10', '2022-09-06', '2022-09-17', '2022-06-30'], 'Date2': ['2022-09-07', '2022-09-22', '2022-09-21', '2022-09-25', '2022-09-21'] } df = pd.DataFrame(data) # 定义日期列表 date_list = ['2022-09-16', '2022-07-01']
步骤2:转换日期类型
将DataFrame的日期列和日期列表转换为datetime类型,确保能正常进行日期比较:
# 转换DataFrame的日期列 df['Date1'] = pd.to_datetime(df['Date1']) df['Date2'] = pd.to_datetime(df['Date2']) # 转换日期列表为datetime对象 date_list = pd.to_datetime(date_list)
步骤3:计算Count列
提供两种实现方式,按需选择:
方式一:逐行判断(代码直观,适合小数据量)
定义函数统计每行符合条件的日期数量,通过apply逐行调用:
def count_dates_in_range(row, dates): return sum((dates >= row['Date1']) & (dates <= row['Date2'])) df['Count'] = df.apply(count_dates_in_range, dates=date_list, axis=1) df2 = df.copy()
方式二:向量化操作(效率更高,适合大数据量)
利用广播生成布尔矩阵,再按列求和得到每行的符合条件次数:
# 生成布尔矩阵:每行对应每个日期是否在区间内 mask = (date_list[:, None] >= df['Date1']) & (date_list[:, None] <= df['Date2']) # 按列求和,得到每行的计数 df['Count'] = mask.sum(axis=0) df2 = df.copy()
查看结果
执行后打印df2即可得到预期输出:
print(df2)
输出:
Date1 Date2 Count 0 2022-09-01 2022-09-07 0 1 2022-09-10 2022-09-22 1 2 2022-09-06 2022-09-21 1 3 2022-09-17 2022-09-25 0 4 2022-06-30 2022-09-21 2
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

