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

如何在R语言中基于日期区间生成带复制值的每日数据集?

问题需求

现有一组包含dates、bi7dr、Month、Year、Day字段的数据集,需要生成从最早给定日期至当日的每日数据,规则为:每个日期沿用前一个给定日期对应的bi7dr值,直至下一个给定日期。

输入数据集

dates bi7dr Month Year Day
 1: 2023-01-19  5.75     1 2023  19
 2: 2022-12-22  5.50    12 2022  22
 3: 2022-11-17  5.25    11 2022  17
 4: 2022-10-20  4.75    10 2022  20
 5: 2022-09-22  4.25     9 2022  22
 6: 2022-08-23  3.75     8 2022  23
 7: 2022-07-21  3.50     7 2022  21
 8: 2022-06-23  3.50     6 2022  23
 9: 2022-05-24  3.50     5 2022  24

期望输出示例

until today 5.75
2023-01-21  5.75
2023-01-20  5.75
2023-01-19  5.75
2023-01-18  5.50
2023-01-17  5.50
...........
2022-12-22  5.50
2022-12-21  5.25
2022-12-20  5.25
until the latest data

解决方案

方案1:R语言(data.table)

适合处理大规模数据,效率较高:

library(data.table)

# 构造输入数据(若已有数据集可直接加载)
dt <- data.table(
  dates = as.Date(c("2023-01-19", "2022-12-22", "2022-11-17", "2022-10-20", "2022-09-22", "2022-08-23", "2022-07-21", "2022-06-23", "2022-05-24")),
  bi7dr = c(5.75, 5.50, 5.25, 4.75, 4.25, 3.75, 3.50, 3.50, 3.50),
  Month = c(1,12,11,10,9,8,7,6,5),
  Year = c(2023,2022,2022,2022,2022,2022,2022,2022,2022),
  Day = c(19,22,17,20,22,23,21,23,24)
)

# 按日期降序排序,确定每个bi7dr的生效区间
dt <- dt[order(-dates)]
dt[, next_date := shift(dates, type = "lead") - 1]
dt[nrow(dt), next_date := dates]

# 生成从最早日期到今日的完整日期序列
full_dates <- seq(from = min(dt$dates), to = Sys.Date(), by = "day")

# 匹配每个日期对应的bi7dr值并按降序输出
result <- data.table(date = full_dates)[
  dt, on = .(date >= next_date, date <= dates), bi7dr := i.bi7dr
][order(-date)]

# 查看结果
print(result)

方案2:Python语言(pandas)

适合熟悉Python生态的用户:

import pandas as pd
from datetime import datetime

# 构造输入数据(若已有数据集可直接加载)
data = {
    "dates": ["2023-01-19", "2022-12-22", "2022-11-17", "2022-10-20", "2022-09-22", "2022-08-23", "2022-07-21", "2022-06-23", "2022-05-24"],
    "bi7dr": [5.75, 5.50, 5.25, 4.75, 4.25, 3.75, 3.50, 3.50, 3.50],
    "Month": [1,12,11,10,9,8,7,6,5],
    "Year": [2023,2022,2022,2022,2022,2022,2022,2022,2022],
    "Day": [19,22,17,20,22,23,21,23,24]
}

df = pd.DataFrame(data)
df["dates"] = pd.to_datetime(df["dates"]).dt.date

# 按日期降序排序
df = df.sort_values(by="dates", ascending=False).reset_index(drop=True)

# 生成完整日期序列
min_date = df["dates"].min()
today = datetime.today().date()
full_dates = pd.date_range(start=min_date, end=today).date
result_df = pd.DataFrame({"date": full_dates})

# 为每个日期匹配对应的bi7dr值
for idx, row in df.iterrows():
    if idx == len(df)-1:
        mask = result_df["date"] <= row["dates"]
    else:
        next_date = df.loc[idx+1, "dates"]
        mask = (result_df["date"] > next_date) & (result_df["date"] <= row["dates"])
    result_df.loc[mask, "bi7dr"] = row["bi7dr"]

# 按日期降序排序并输出
result_df = result_df.sort_values(by="date", ascending=False).reset_index(drop=True)
print(result_df)

内容的提问来源于stack exchange,提问作者Ewang Khoirul Asrori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:50:16