我有GPS标签数据,这是只有过夜的位置.这已经从一个主要数据集中过滤出来了,这个主要数据集根据日落和日出时间计算白天和黑夜.由于所有白天的位置都已被移除,夜间可以被归类为下午3点到上午10点,以考虑到季节性变化,并确保包括所有数据点.

数据当前格式为正常日期和时间,例如2019-03-22 21:53:00和2019-03-23 02:46:00.然而,从技术上讲,这些数据来自同一晚.我想在R中的数据框中添加一个新列,它将每个晚上的数据分组(而不是在它们的"真实"日期),并将午夜之后的日期/时间分配给开始日期.因此,加上上面两个日期,它们都应该是2019-03-22.

到目前为止,我已经try 了以下代码,但它出现了错误,并且输出列是数字(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还很陌生,所以任何帮助都将不胜感激,谢谢你抽出时间来!

推荐答案

我认为这里有几个问题.

  1. 您调用as.日期(.),但不要将其重新分配回帧.由于您的错误(#2),这可能还不是问题,但要知道您需要这样做

    sample$Night日期 <- as.日期(...)
    
  2. DATE-OBJECTS中的数字是自"起源"以来的天数.包括R在内的大多数计算(我相信)使用1970-01-01,但Excel使用1899-12-30.R不会为您假定这一点(尽管许多人确实希望它默认为1970-01-01的"纪元"起源),但您需要指定它.try

    sample$Night日期 <- as.日期(sample$Night日期, origin = "1970-01-01")
    

    它可以是日期对象as.日期("1970-01-01")或明确表示日期的对象,就像我在上面所做的那样.

  3. ifelse级退学了it's a known thing级很不幸您可以通过从ifelse的返回值中删除日期对象来避免删除该类.也许

    sample$Night日期 <- sample$日期Time - ifelse(hour(sample$日期Time) < 8, 86400, 0)
    

    其中86400是一天中的秒数.(应该注意,Timestamp/POSIXt对象的单位为1 sec,而日期/日期对象的单位为1 day.

底线是,从日期Time开始(作为POSIXt时间戳),您可以使用

sample |>
  transform(
    Night日期 = as.日期(trunc(
      日期Time - ifelse(lubridate::hour(日期Time) < 8, 86400, 0),
      by = "days"))
  )
#               日期Time  Night日期
# 1  2019-03-22 00:34:00 2019-03-21
# 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-22
# 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-24
# 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

lubridate::hour函数非常有用.如果您没有使用lubridate做任何其他事情,并且需要减少使用其他包,您可以使用as.integer(format(日期Time, format="%H"))as.POSIXlt(sample$日期Time)$hour,两者在效果上是相同的(尽管在控制台上,lubridate::hourrender相比有一种"奇特"的方式).


日期

sample <- structure(list(日期Time = 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")

R相关问答推荐

通过绘图 Select 线串几何体并为其着色

使用Shiny组合和显示复制和粘贴的数据

如何在R中正确对齐放射状图中的文本

geom_Ribbon条件填充创建与数据不匹配的形状(ggplot 2 r)

如何删除R中除某些特定名称外的所有字符串?

在数学中正确显示摄氏度、开氏度或华氏度

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

将数字转换为分钟和秒

用关联字符串替换列名的元素

R中边际效应包中Logistic回归的交互作用风险比

SHINY:使用JS函数应用的CSS样式显示HTML表格

如何使这些react 表对象相互独立?

将工作目录子文件夹中的文件批量重命名为顺序

我需要使用ggplot2制作堆叠条形图

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

如何用不同长度的向量填充列表?

使用列名和r中的前缀 Select 列的CREATE函数

如何在R中添加标识连续日期的新列

如何从矩阵绘制环弦图