使用R的calendar包转换DataFrame为ICS文件无效问题求助
我有如下结构的DataFrame:
structure(list(`DTEND;VALUE=DATE` = structure(c(19389, 19395, 19396, 19402, 19409, 19410), class = "Date"), `DTSTART;VALUE=DATE` = structure(c(19389, 19395, 19396, 19402, 19409, 19410), class = "Date"), SUMMARY = c("Activity", "Activity", "Activity", "Activity", "Activity", "Activity"), UID = c("beb9cbab6d0a2534d17c", "0f57d3b22bd2b6ed4950", "c3f192b290e8f001529c", "c15769cc203dfbe8caa6", "d3554e447336aa78ddd8", "e78a4cfd97307bdb2ea5"), SEQUENCE = c("0", "0", "0", "0", "0", "0"), DTSTAMP = c("20230116T175008Z", "20230116T175008Z", "20230116T175008Z", "20230116T175008Z", "20230116T175008Z", "20230116T175008Z" ), DESCRIPTION = c("link to open", "to open", "link to open", "link to open", "link to open", "link to open" ), LOCATION = c("M", "M", "M", "M", "M", "M" )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" ))
我尝试使用R的calendar包将该DataFrame转换为可用的ICS格式,执行ic_write(df, MY-DESKTOP-LOCATION)后虽能在本地生成ICS文件,但无法导入Outlook或直接打开。而使用该包文档中的示例ICS文件,经ic_read()转为DataFrame后再用ic_write()生成的文件却能正常使用。这些事件应为全天事件,请问我的DataFrame存在什么问题?
你的DataFrame主要有两个问题,导致生成的ICS不符合Outlook的解析标准:
全天事件的日期规则不匹配
ICS标准中,全天事件的DTEND是排他性的(即事件结束于该日期的0点),所以如果是单日全天事件,DTEND必须比DTSTART晚一天。你的DataFrame中DTEND和DTSTART完全相同,Outlook无法识别为有效全天事件。列名格式不符合
calendar包预期
你使用的列名是DTEND;VALUE=DATE和DTSTART;VALUE=DATE,但calendar包通过ic_read()生成的DataFrame中,列名是不带参数后缀的DTEND和DTSTART,参数信息会被包内部处理为日期属性。直接使用带后缀的列名,会导致ic_write()生成的ICS内容格式错误。
修正步骤:
调整日期列名
将带后缀的列名重命名为标准列名:df <- df %>% rename(DTSTART = `DTSTART;VALUE=DATE`, DTEND = `DTEND;VALUE=DATE`)修正全天事件的结束日期
给每个DTEND加1天,符合ICS标准:df$DTEND <- df$DTEND + 1重新生成ICS文件
执行ic_write(df, "path/to/your/file.ics"),此时生成的文件应该能正常导入Outlook。
内容的提问来源于stack exchange,提问作者alec22

