周五有公休日时,如何将USDINR日度数据转换为周度数据?
日转周度数据处理:周五休市时标记周四为周收盘价
问题背景
需将USDINR日度数据转换为周度/月度数据,但周五常因市场休市缺失。每年约18个休市日,20年共360个,计划通过二进制变量筛选实现高效处理,核心需求:当周五缺失时,将前一天周四标记为周度收盘价(给对应周四的week字段赋值1)。
尝试过的无效代码
第一段代码(week始终返回0)
for(i in 1:length(df01$day)){ if(df01$day[i] == 'Friday'){ df01$count[i] = 1 } else df01$count[i] = 0 if(seq(df01$count[i] == 0)>4){ df01$week['Thursday'] = 1 } else df01$week[i] = 0 }
第二段代码(week仍返回0)
for(i in 1:length(df01$day)){ if(df01$day[i] == 'Friday'){ df01$count[i] = 1 } else df01$count[i] = 0 } for(i in 1:length(df01$day)){ if(df01$count[i] == 1 & df01$count[i]+5 == 0){ df01$week[i]+4 = 1 } else df01$week[i] = 0 }
有效解决方案
核心思路
放弃低效循环,用R的向量化操作实现:
- 先给所有存在的周五标记为周收盘价(
week=1) - 找出每个周的最后一个交易日,无论该日是周五还是周四(周五缺失时),统一标记为
week=1
具体代码实现
假设数据框df01包含标准Date类型的日期列date:
# 确保日期列是Date格式 df01$date <- as.Date(df01$date) # 1. 初始标记:所有存在的周五设为周收盘价 df01$week <- ifelse(weekdays(df01$date) == "Friday", 1, 0) # 2. 给每个日期分配ISO周标识(格式:年-周数) df01$iso_week <- strftime(df01$date, "%Y-%V") # 3. 提取每个周的最后一个交易日 library(dplyr) last_trading_day_per_week <- df01 %>% group_by(iso_week) %>% slice(n()) %>% pull(date) # 4. 覆盖标记:将每个周的最后交易日统一设为1 df01$week[df01$date %in% last_trading_day_per_week] <- 1
拓展:月度数据处理
用相同逻辑处理月度收盘价,标记每个月的最后一个交易日:
# 给每个日期分配年月标识(格式:年-月) df01$year_month <- strftime(df01$date, "%Y-%m") # 提取每个月的最后一个交易日 last_trading_day_per_month <- df01 %>% group_by(year_month) %>% slice(n()) %>% pull(date) # 标记月度收盘价 df01$month <- ifelse(df01$date %in% last_trading_day_per_month, 1, 0)
原代码无效原因
- 第一段代码:
seq(df01$count[i] == 0)>4逻辑错误,seq()用法不符合需求;df01$week['Thursday']是按列名索引,而非行索引,完全偏离目标。 - 第二段代码:
df01$count[i]+5 == 0逻辑不通;df01$week[i]+4 = 1是语法错误,R不支持这种赋值方式。
内容的提问来源于stack exchange,提问作者Punit Pillin
相关产品推荐
相关产品推荐

