【问题标题】:How to generate a sequence of dates and times with a specific start date/time in R如何在R中生成具有特定开始日期/时间的日期和时间序列
【发布时间】:2019-03-07 04:22:38
【问题描述】:

我希望生成或完成一列日期和时间。我有一个包含四个数字列和一个 POSIXct 时间列的数据框,如下所示:

    CH_1   CH_2  CH_3  CH_4           date_time
1 -10096 -11940 -9340 -9972 2018-07-24 10:45:01
2 -10088 -11964 -9348 -9960                <NA>
3 -10084 -11940 -9332 -9956                <NA>
4 -10088 -11956 -9340 -9960                <NA>
5 -10084 -11944 -9332 -9976                <NA>
6 -10076 -11940 -9340 -9948                <NA>
7 -10088 -11956 -9352 -9960                <NA>
8 -10084 -11944 -9348 -9980                <NA>
9 -10076 -11964 -9348 -9976                <NA>
0 -10076 -11956 -9348 -9964                <NA>

我想为 date_time 列按顺序生成日期和时间,增加 1 秒,直到数据框被填满。 (即下一个日期/时间应该是 2018-07-24 10:45:02)。这意味着对于多个数据集是可重现的,并且需要填充的行数并不总是已知的,但开始日期/时间将始终存在于第一个单元格中。

我知道解决方案可能在 seq.Date (或类似的)内,但我遇到的问题是我并不总是知道结束日期/时间,这是我发现的大多数示例所需要的。任何帮助将不胜感激!

【问题讨论】:

  • 请使用dput() 和您正在处理的代码分享您的数据,以便其他人可以提供帮助。在此处查看更多信息How to make a great R reproducible example?
  • 如果你总是在第一行有数据,你可以试试seq(as.POSIXct(df$date_time[1]), length.out = nrow(df), by = "1 sec")。例如,检查此seq(as.POSIXct("2018-07-24 10:45:01"), length.out = 10, by = "1 sec")

标签: r date dplyr lubridate posixct


【解决方案1】:

这是一个tidyverse 解决方案,使用 Zygmunt Zawadzki 的示例数据:

library(lubridate)
library(tidyverse)

df %>% mutate(date_time = date_time[1] + seconds(row_number()-1)) 

输出:

             date_time
1  2018-01-01 00:00:00
2  2018-01-01 00:00:01
3  2018-01-01 00:00:02
4  2018-01-01 00:00:03
5  2018-01-01 00:00:04
6  2018-01-01 00:00:05
7  2018-01-01 00:00:06
8  2018-01-01 00:00:07
9  2018-01-01 00:00:08
10 2018-01-01 00:00:09
11 2018-01-01 00:00:10

数据:

df <- data.frame(date_time = c(as.POSIXct("2018-01-01 00:00:00"), rep(NA,10)))

【讨论】:

    【解决方案2】:

    无需润滑,只需 R 代码:

    x <- data.frame(date = c(as.POSIXct("2018-01-01 00:00:00"), rep(NA,10)))
    startDate <- x[["date"]][1]
    x[["date2"]] <- startDate + (seq_len(nrow(x)) - 1)
    x
    #         date               date2
    # 1  2018-01-01 2018-01-01 00:00:00
    # 2        <NA> 2018-01-01 00:00:01
    # 3        <NA> 2018-01-01 00:00:02
    # 4        <NA> 2018-01-01 00:00:03
    # 5        <NA> 2018-01-01 00:00:04
    # 6        <NA> 2018-01-01 00:00:05
    # 7        <NA> 2018-01-01 00:00:06
    # 8        <NA> 2018-01-01 00:00:07
    # 9        <NA> 2018-01-01 00:00:08
    # 10       <NA> 2018-01-01 00:00:09
    # 11       <NA> 2018-01-01 00:00:10
    

    【讨论】:

    • 感谢您的解决方案。它工作得很好,但我有一个后续问题。我如何将时间增加十分之一秒?例如,如果起点是 2018-07-24 10:45:01.1,我希望下一行是 2018-07-24 10:45:01.2?
    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多