You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于起止日期为日期序列DataFrame匹配对应变量的实现方法

匹配日期序列与变量起止区间

需求说明

将存储连续日期序列的DataFrame与包含变量起止日期的DataFrame合并,为每个日期分配对应的变量,得到指定格式的结果。

可复现数据

# 生成日期序列DataFrame
date.seq <- seq.Date(as.Date("01/01/2024", '%m/%d/%Y'), by = 'day', length.out = 20)
date.df <- as.data.frame(date.seq)

# 生成变量起止日期DataFrame
x.start <- as.Date("01/01/2024", '%d/%m/%Y')
y.start <- as.Date("10/01/2024", '%d/%m/%Y')
z.start <- as.Date("17/01/2024", '%d/%m/%Y')

x.end <- as.Date("10/01/2024", '%d/%m/%Y')
y.end <- as.Date("17/01/2024", '%d/%m/%Y')
z.end <- as.Date("20/01/2024", '%d/%m/%Y')

df <- data.frame(var = c('x','y','z'),
                 start = c(x.start, y.start, z.start),
                 end = c(x.end, y.end, z.end))

解决方案

方法1:Base R 实现

直接遍历日期序列,匹配对应变量区间:

# 为每个日期匹配对应变量并转大写
date.df$Var <- toupper(sapply(date.df$date.seq, function(d) {
  df$var[df$start <= d & d <= df$end]
}))

# 输出结果
print(date.df)

方法2:dplyr + lubridate 实现(高效简洁)

适合数据量较大的场景,通过交叉组合后筛选:

library(dplyr)
library(lubridate)

result <- date.df %>%
  crossing(df) %>%  # 生成所有日期与变量的组合
  filter(date.seq >= start, date.seq <= end) %>%  # 筛选符合区间的记录
  mutate(Var = toupper(var)) %>%  # 变量名转大写
  select(date.seq, Var)  # 保留目标列

# 输出结果
print(result)

结果验证

两种方法均会输出符合预期的结果:

date.seq Var
1  2024-01-01   X
2  2024-01-02   X
3  2024-01-03   X
4  2024-01-04   X
5  2024-01-05   X
6  2024-01-06   X
7  2024-01-07   X
8  2024-01-08   X
9  2024-01-09   X
10 2024-01-10   X
11 2024-01-11   Y
12 2024-01-12   Y
13 2024-01-13   Y
14 2024-01-14   Y
15 2024-01-15   Y
16 2024-01-16   Y
17 2024-01-17   Y
18 2024-01-18   Z
19 2024-01-19   Z
20 2024-01-20   Z

内容的提问来源于stack exchange,提问作者Shaggy Glitch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:35:57