R - 如何将夜间 GPS 数据(即跨越午夜的数据)指定为相同的开始日期?

问题描述 投票:0回答:1

我有 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 还很陌生,因此我们将不胜感激,感谢您的宝贵时间!

r gps grouping posixct
1个回答
0
投票

我认为这里存在一些问题。

  1. 您调用

    as.Date(.)
    但不将其重新分配回框架。由于您的错误(#2),这可能还不是问题,但知道您需要这样做

    sample$NightDate <- as.Date(...)
    
  2. 日期对象中的数字是自“起源”以来的天数。大多数计算(我相信)包括 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")
    或明确是日期的东西,就像我上面所做的那样。

  3. 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")
© www.soinside.com 2019 - 2024. All rights reserved.