如何将表格中各Symbol的起止日期转为日期序列?附优化需求
日期范围扩展表的优化问题
需求背景
基于表格中的entry_date和remove_date字段扩展表格,以便后续进行日期匹配的表连接操作。
原表格
| symbol | ind_code | entry_date | remove_date |
|---|---|---|---|
| A | 6112 | 2000.09.07 | 2001.09.03 |
| B | 6112 | 2009.11.11 | 2011.10.08 |
| C | 6112 | 2012.01.21 | 2013.01.05 |
期望扩展结果
每个symbol对应entry_date至remove_date之间的每日记录,结构如下:
| symbol | ind_code | date |
|---|---|---|
| A | 6112 | 2000.09.07 |
| A | 6112 | 2000.09.08 |
| ... | ... | ... |
| A | 6112 | 2001.09.03 |
| B | 6112 | 2009.11.11 |
| ... | ... | ... |
| C | 6112 | 2012.01.21 |
| ... | ... | ... |
现有实现脚本
// original table t = table( `A`B`C as SYMBOL, `6112`6112`6112 as IND_CODE, [2000.09.07, 2009.11.11, 2012.01.21] as ENTRY_DT, [2001.09.03, 2011.10.08, 2013.01.05] as REMOVE_DT ) // initialize result table re = table(1:0, `symbol`ind_code`date, [SYMBOL, SYMBOL, DATE]) // use for loop to tranverse each row in original table // use `take` or `seq` function to transform a single-row record into multiple rows aligned with the expanded date range. for(row in t){ date = seq(row[`ENTRY_DT], row[`REMOVE_DT]) ind_code = take(row[`IND_CODE], date.size()) symbol = take(row[`SYMBOL], date.size()) re.tableInsert(table(symbol, ind_code, date)) } select * from re
现有脚本可实现需求,但生成的是所有日历日,需后续过滤。现咨询两个问题:
- 是否存在可直接生成工作日的函数?
- 能否将现有脚本改写为向量化实现方式?
解答
1. 直接生成工作日的函数
在DolphinDB中,可使用businessDays函数直接生成指定日期范围内的工作日,该函数默认排除周末,也支持传入自定义节假日列表过滤指定日期。
示例用法:
// 生成默认规则下的工作日 businessDays(2000.09.07, 2001.09.03) // 传入自定义节假日列表 customHolidays = [2000.10.01, 2000.10.02, 2000.10.03] businessDays(2000.09.07, 2001.09.03, customHolidays)
2. 向量化实现方式
利用DolphinDB的each和flatten函数实现向量化扩展,替代循环遍历,大幅提升执行效率:
// 原表定义 t = table( `A`B`C as SYMBOL, `6112`6112`6112 as IND_CODE, [2000.09.07, 2009.11.11, 2012.01.21] as ENTRY_DT, [2001.09.03, 2011.10.08, 2013.01.05] as REMOVE_DT ) // 向量化生成日期数组(日历日) t[`dateArray] = each(seq, t.ENTRY_DT, t.REMOVE_DT) // 若需生成工作日,替换为:each(businessDays, t.ENTRY_DT, t.REMOVE_DT) // 展平数组得到最终结果表 result = select symbol, ind_code, flatten(dateArray) as date from t
这种方式无需循环和逐行插入,性能远优于原脚本,且可灵活切换生成日历日或工作日。
内容的提问来源于stack exchange,提问作者Polly
相关产品推荐
相关产品推荐

