【问题标题】:Year-Week add a week in rYear-Week 在 r 中添加一周
【发布时间】:2015-08-18 12:59:53
【问题描述】:

我有一个数据框,其中有一列包含日期和时间,并且我使用此公式创建了一个包含年-周的新列,

Path     LogTime
HJH      2015-06-19 01:57:11
GTF      2015-07-31 08:23:34
R        2015-07-21 11:52:31

Path2$Week<-strftime(Path2$LogTime,format="%Y-%W",tz="CET")
Path     LogTime                Week
HJH      2015-06-19 01:57:11    2015-24
GTF      2015-07-31 08:23:34    2015-30
R        2015-07-21 11:52:31    2015-29

我现在想再增加一周,所以不要说

Path     LogTime                Week       NEW Week
HJH      2015-06-19 01:57:11    2015-24    2015-25
GTF      2015-07-31 08:23:34    2015-30    2015-31
R        2015-07-21 11:52:31    2015-29    2015-30

如何在 R 中做到这一点?我在 R 中日期的迷宫中找不到路

【问题讨论】:

  • @DavidArenburg 是的,你是对的。因此,也许最好转换为“日期”类并进行转换。
  • @akrun 我认为 OP 只需要首先提供他真实数据集的平静。
  • @DavidArenburg 我已经用一些数据更新了这个问题。希望这会有所帮助
  • 我会选择Path2$NewWeek &lt;- strftime(Path2$LogTime + 60*60*24*7, format = "%Y-%W", tz = "CET")

标签: r date week-number


【解决方案1】:
Path$New.Week <- strftime(as.Date(Path$LogTime)+7, "%Y-%W", tz="CET")
   Path            LogTime    Week New.Week
1  HJH 2015-06-19 01:57:11 2015-24  2015-25
2  GTF 2015-07-31 08:23:34 2015-30  2015-31
3    R 2015-07-21 11:52:31 2015-29  2015-30

正如@DavidArenburg 在 cmets 中提到的,如果 LogTime 列采用任何正确的日期格式,例如您的示例中的 POSIXct,而不是字符串或因子,则可以使用以下命令保存操作:

Path$NewWeek <- strftime(Path$LogTime + 60*60*24*7, format = "%Y-%W", tz = "CET")

【讨论】:

  • 这是一个不错的语法,但对于相对较大的数据集,转换为 as.Date 可能会很昂贵。我也会添加Path2$NewWeek &lt;- strftime(Path2$LogTime + 60*60*24*7, format = "%Y-%W", tz = "CET") 作为替代方案。
  • 一开始我并没有假设日期格式,但是如果 OP 开始了 Week 列,他们必须已经转换了。
  • 我的意思是Path2$LogTime + 60*60*24*7 可以避免您的as.Date(Path$LogTime) 行,这将是更有效的IMO。我唯一关心的可能是时区,不知道。
  • 为了清楚起见,“日期”是指它被识别为日期,而不是特定的"Date" 类。任何都可以,包括POSIXct
  • 我得到“as.POSIXlt.numeric(x, tz = tz) 中的错误:必须提供'origin'”
【解决方案2】:

与 R 的情况一样,“有一个包”。我推荐lubridate。这个chapter 涵盖了所有常见的任务。这会将您的任务变成一行而不会丢失信息:

library(lubridate)   
data$New.Week <- data$LogTime + weeks(1)

通过从 LogTime 中删除日期/时间,您会丢失大量信息。并且通过将 LogTime 转换为类型字符,当您想要执行数学运算时,您就是在自找麻烦。

但是,我敢打赌,您正在尝试获取 YYYY-WW,因为您正在尝试执行一些摘要或其他操作。如果是这种情况,您甚至不需要计算 YYYY-WW。只需使用来自dplyrgroup_by(包含在tidyverse 中)。

library(tidyverse)
data %>%
  group_by(year(LogTime),week(LogTime)) %>%
  summarise(count_by_week = n())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2023-03-13
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多