我有 GPS 标签数据,仅适用于夜间位置。这是从主要数据集中过滤出来的,该数据集根据日落和日出时间计算白天和黑夜。由于全天地点已被删除,夜间可分为下午 3 点至上午 10 点,以适应季节变化并确保包含所有数据点。
数据当前采用正常日期和时间格式,例如2019-03-22 21:53:00 和 2019-03-23 02:46:00。然而,从技术上讲,这个数据是来自同一晚的。我想在 R 中的数据框中添加一个新列,该列对每晚的数据(而不是“真实”日期)进行分组,并将午夜之后的日期/时间分配给开始日期的日期/时间。因此,对于上面的两个日期,它们都是 2019-03-22。
到目前为止,我已经尝试了以下代码,但它出错了,并且输出列是数字(17976)而不是日期:
# Convert DateAndTime column to POSIXct format
sample$DateTime <- as.POSIXct(sample$DateTime, format = "%d/%m/%Y %H:%M")
# Extract date component
sample$Date <- as.Date(sample$DateTime)
# Assign the night date
sample$NightDate <- ifelse(hour(sample$DateTime) < 8,
sample$Date - days(1),
sample$Date)
# change NightDate from numbers (17976) back to a date
as.Date(sample$NightDate)
# error which occurs: Error in as.Date.numeric(GE.sample$NightDate) : 'origin' must be supplied
由于数据保护,我无法共享大部分数据,但这是我正在处理的 DateTime 列的示例:
# DateTime Data set
2019-03-22 00:34:00
2019-03-22 02:43:00
2019-03-22 04:56:00
2019-03-22 19:28:00
2019-03-22 21:53:00
2019-03-23 02:46:00
2019-03-23 20:32:00
2019-03-23 23:04:00
2019-03-24 01:40:00
2019-03-24 04:17:00
2019-03-24 19:34:00
2019-03-24 23:22:00
2019-03-25 02:03:00
2019-03-25 04:48:00
我对 R 还很陌生,因此我们将不胜感激,感谢您的宝贵时间!
我认为这里存在一些问题。
您调用
as.Date(.)
但不将其重新分配回框架。由于您的错误(#2),这可能还不是问题,但知道您需要这样做
sample$NightDate <- as.Date(...)
日期对象中的数字是自“起源”以来的天数。大多数计算(我相信)包括 R 使用
1970-01-01
,但 Excel 使用 1899-12-30
。 R 不会为你假设这一点(尽管很多人确实希望它默认为 1970-01-01
的“纪元”原点),你需要指定它。尝试一下
sample$NightDate <- as.Date(sample$NightDate, origin = "1970-01-01")
它可以是一个日期对象
as.Date("1970-01-01")
或明确是日期的东西,就像我上面所做的那样。
ifelse
退课,这是众所周知的事情,不幸的是。您可以通过从 Date
返回值内部删除 ifelse
对象来避免删除该类。也许
sample$NightDate <- sample$DateTime - ifelse(hour(sample$DateTime) < 8, 86400, 0)
其中
86400
是一天的秒数。 (需要注意的是,时间戳/POSIXt
对象的单位为1 sec
,日期/Date
对象的单位为1 day
。
底线,从
DateTime
开始(作为 POSIXt
时间戳),您可以使用 获得
NightDate
sample <- sample |>
transform(NightDate = as.Date(DateTime - ifelse(lubridate::hour(DateTime), 86400, 0)))
sample
# DateTime NightDate
# 1 2019-03-22 00:34:00 2019-03-22
# 2 2019-03-22 02:43:00 2019-03-21
# 3 2019-03-22 04:56:00 2019-03-21
# 4 2019-03-22 19:28:00 2019-03-21
# 5 2019-03-22 21:53:00 2019-03-22
# 6 2019-03-23 02:46:00 2019-03-22
# 7 2019-03-23 20:32:00 2019-03-23
# 8 2019-03-23 23:04:00 2019-03-23
# 9 2019-03-24 01:40:00 2019-03-23
# 10 2019-03-24 04:17:00 2019-03-23
# 11 2019-03-24 19:34:00 2019-03-23
# 12 2019-03-24 23:22:00 2019-03-24
# 13 2019-03-25 02:03:00 2019-03-24
# 14 2019-03-25 04:48:00 2019-03-24
日期
sample <- structure(list(DateTime = structure(c(1553229240, 1553236980, 1553244960, 1553297280, 1553305980, 1553323560, 1553387520, 1553396640, 1553406000, 1553415420, 1553470440, 1553484120, 1553493780, 1553503680), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = c(NA, -14L), class = "data.frame")