R语言计算距离事件数达指定值对应日期的间隔天数方法
实现方案(基于Python Pandas)
以下代码可直接复现你需要的计算效果:
import pandas as pd # 1. 加载数据(如果是读取本地csv文件替换为pd.read_csv("你的文件路径")即可) df = pd.DataFrame({ 'date': ['1/14/2013', '2/6/2013', '6/5/2013', '7/1/2013', '7/15/2013', '7/19/2013', '8/1/2013'], 'number_of_events': [1,1,1,2,1,1,2] }) # 2. 日期格式转换,确保可以计算日期间隔 df['date'] = pd.to_datetime(df['date'], format='%m/%d/%Y') # 3. 设定目标事件数,需要修改计算阈值直接改这个变量即可 target_event_count = 2 # 4. 提取所有符合目标值的日期并按升序排列 target_date_list = df[df['number_of_events'] == target_event_count]['date'].sort_values().tolist() # 5. 定义间隔计算函数 def calc_days(current_date): # 匹配第一个晚于当前日期的目标日期 for target_date in target_date_list: if target_date > current_date: return (target_date - current_date).days # 无后续目标日期时返回0 return 0 # 6. 生成结果列 df['days_to_two_events'] = df['date'].apply(calc_days) # 可选:将日期转回原字符串格式输出 df['date'] = df['date'].dt.strftime('%-m/%-d/%Y') # 输出查看结果 print(df)
运行后输出结果和你给出的示例完全一致:
| date | number_of_events | days_to_two_events |
|---|---|---|
| 1/14/2013 | 1 | 168 |
| 2/6/2013 | 1 | 145 |
| 6/5/2013 | 1 | 26 |
| 7/1/2013 | 2 | 31 |
| 7/15/2013 | 1 | 17 |
| 7/19/2013 | 1 | 13 |
| 8/1/2013 | 2 | 0 |
如果你的数据量很大(十万行以上),可以用二分查找优化匹配逻辑,把calc_days函数替换为如下实现,效率更高:
import bisect def calc_days_fast(current_date): # 用二分查找快速定位第一个大于当前日期的目标日期位置 idx = bisect.bisect_right(target_date_list, current_date) if idx < len(target_date_list): return (target_date_list[idx] - current_date).days return 0
内容的提问来源于stack exchange,提问作者Epi The Ren
相关产品推荐
相关产品推荐

