【发布时间】:2019-06-07 09:21:59
【问题描述】:
我有一个包含 POSIXct 日期/时间列的数据表。我想创建一个基于 POSIXct 时间戳指定“白天”或“夜晚”的列。当地时间定义为 05:30:00 到 20:00:00 之间的日期。
我尝试使用 ifelse 语句创建新变量,该语句基于使用 strptime 创建的“一天中的时间”列,但结果很奇怪。
这是一个简单的示例 - 将其设置为数据表以匹配我的真实数据集。
library(data.table)
SightingTime = c("2017-07-31 09:56:27 UTC", "2017-07-31 10:36:30 UTC", "2017-08-01 00:07:20 UTC","2017-08-01 01:31:00 UTC", "2017-08-01 10:38:23 UTC", "2017-08-01 21:13:06 UTC", "2017-08-02 15:13:30 UTC", "2017-08-02 18:05:28 UTC", "2017-08-02 21:04:08 UTC")
x=data.table(SightingTime)
首先,我从日期/时间变量中提取一天中的时间 - 我想要在当地时间,因为我将在当地时间指定日出/日落。
x$TOD = strftime(x$SightingTime, format="%H:%M:S",tz="America/Halifax")
我不确定为什么新的 TOD 变量仍然使用 UTC,即使我指定了不同的时区。
然后尝试使用 ifelse 语句创建一个新变量
x$daynight = with(x,
ifelse(TOD > 05:30:00 & TOD < 20:00:00, "Day", "Night"))
当我收到警告消息并且“日/夜”列中的结果没有意义时,我显然有一点不正确。
我希望是这样的。
SightingTime TOD daynight
1: 2017-07-31 09:56:27 UTC 06:56:27 Day
2: 2017-07-31 10:36:30 UTC 07:36:30 Day
3: 2017-08-01 00:07:20 UTC 21:07:20 Night
4: 2017-08-01 01:31:00 UTC 22:31:00 Night
5: 2017-08-01 10:38:23 UTC 07:38:23 Day
6: 2017-08-01 21:13:06 UTC 08:13:06 Day
7: 2017-08-02 15:13:30 UTC 12:13:30 Day
8: 2017-08-02 18:05:28 UTC 15:05:28 Day
9: 2017-08-02 21:04:08 UTC 18:04:08 Day
【问题讨论】:
-
问题多于链接问题。从字符到
POSIXct的转换不起作用,字符向量的 tz 似乎是 UTC 并且需要转换,一天中的时间没有正确提取,ifelse中的比较不起作用,因为05:30:00是不是有效的格式(既不是数字也不是字符)。我写了一个比链接的答案更完整的答案,但现在无法发布。我认为这是错误地关闭... -
@JBGruber 我的错误,我重新打开了。很抱歉给您带来不便。
-
没问题。谢谢@Henrik
-
鉴于你使用
data.table,你也可以试试ITime类和between:x[ , daynight := c("night", "day")[(as.ITime(SightingTime) %between% as.ITime(c("05:30:00", "20:00:00")) + 1)]]