Spotfire中用Lubridate按任务起止日期拆分行及报错排查
在Spotfire中用R拆分任务起止日期为月度多行数据并解决"object 'TYPE' not found"错误
问题背景
你的数据集每行包含TASK_START、TASK_END、用户、项目等字段,需要将跨月的任务拆分成对应月份的独立行(比如任务从2023-05-20到2023-07-10,需拆分为5月、6月、7月三行)。因无法通过SQL创建视图处理,转而使用Spotfire结合R的lubridate和data.table工具,但执行脚本时出现object 'TYPE' not found错误。
错误原因
object 'TYPE' not found的核心原因是脚本中引用了名为TYPE的变量/列,但你的数据集里不存在该字段,或是引用时出现拼写错误、未正确匹配Spotfire输入数据的列名(比如大小写不一致、列名带空格未加反引号)。
正确实现脚本(Spotfire R脚本)
先确保在Spotfire中已将目标数据集设为R脚本的输入数据(默认名为InputData),然后使用以下脚本替换原有错误代码,完成日期拆分:
# 加载依赖包 library(data.table) library(lubridate) # 将Spotfire输入数据转为data.table格式 dt <- as.data.table(InputData) # 生成每个任务覆盖的所有月份序列 dt[, month_seq := Map(function(start, end) { seq(floor_date(start, "month"), floor_date(end, "month"), by = "month") }, TASK_START, TASK_END)] # 拆分原行为月度多行,保留所有原字段 dt_expanded <- dt[, .( MONTH = unlist(month_seq), USER = USER, # 替换为你数据集实际的用户列名 PROJECT = PROJECT, # 替换为你数据集实际的项目列名 # 这里添加所有需要保留的其他字段 TASK_ORIGINAL_START = TASK_START, TASK_ORIGINAL_END = TASK_END ), by = .(ROWID)] # ROWID是Spotfire自动生成的行唯一标识,用于关联原行数据 # 清理临时列 dt_expanded[, c("month_seq", "ROWID") := NULL] # 计算每个月的实际任务起止日期(处理跨月边界) dt_expanded[, MONTH_START := floor_date(MONTH, "month")] dt_expanded[, MONTH_END := ceiling_date(MONTH, "month") - days(1)] dt_expanded[, TASK_MONTH_START := pmax(TASK_ORIGINAL_START, MONTH_START)] dt_expanded[, TASK_MONTH_END := pmin(TASK_ORIGINAL_END, MONTH_END)] # 设置输出给Spotfire的数据集 OutputData <- dt_expanded
关键注意事项
- 列名匹配:确保脚本中所有字段名(如
USER、PROJECT)和你数据集的实际列名完全一致,若列名带空格,需用反引号包裹(比如USER NAME要写成`USER NAME`)。 - 字段保留:根据实际需求,在拆分步骤中添加所有需要保留的原表字段,不要遗漏。
- 日期边界处理:脚本中生成的
TASK_MONTH_START和TASK_MONTH_END会自动计算任务在对应月份的实际起止日期,避免跨月数据的日期错误。
测试示例
假设输入数据一行:
| TASK_START | TASK_END | USER | PROJECT |
|---|---|---|---|
| 2023-05-20 | 2023-07-10 | Alice | ProjectA |
拆分后输出三行:
| MONTH | USER | PROJECT | TASK_ORIGINAL_START | TASK_ORIGINAL_END | MONTH_START | MONTH_END | TASK_MONTH_START | TASK_MONTH_END |
|---|---|---|---|---|---|---|---|---|
| 2023-05-01 | Alice | ProjectA | 2023-05-20 | 2023-07-10 | 2023-05-01 | 2023-05-31 | 2023-05-20 | 2023-05-31 |
| 2023-06-01 | Alice | ProjectA | 2023-05-20 | 2023-07-10 | 2023-06-01 | 2023-06-30 | 2023-06-01 | 2023-06-30 |
| 2023-07-01 | Alice | ProjectA | 2023-05-20 | 2023-07-10 | 2023-07-01 | 2023-07-31 | 2023-07-01 | 2023-07-10 |
内容的提问来源于stack exchange,提问作者Phic
相关产品推荐
相关产品推荐

