更改 R 中日期时间中特定位置的数字

Changing the number on a specific position in a datetime in R

我想知道是否有办法更改日期时间中特定位置的数字?

我有一个这样的数据框 [df]:

id    created_at            diff
1     2020-04-08 14:30:47   89  
2     2020-04-08 14:30:47   0
3     2020-04-08 15:30:47   78
4     2020-04-08 15:30:47   0

我想更改 diff = 0 的行的 created_at 值,我想在其中添加 10 分钟,或者可能通过添加 1 来更改位置 15 上的数字。

理想的结果如下所示:

id    created_at            diff
1     2020-04-08 14:30:47   89  
2     2020-04-08 14:40:47   0
3     2020-04-08 15:30:47   78
4     2020-04-08 15:40:47   0

有什么办法吗? 非常感谢您的任何建议!

您可以使用这样的代码:

library(dplyr)
library(lubridate)

df %>% mutate(created_at = if_else(diff == 0, created_at + minutes(1), created_at))

假设created_by列是一个字符串(类型字符),你可以把它转换成一个date/time,加上10分钟,然后再转换回字符串:

# Which rows to modify
r = which(df$diff == 0)

# read the created_at column, and convert to date/time
v = as.POSIXlt( df[r, 'created_at'])

# Add 10 minutes (10*60 seconds)
v = v + 10*60

# write values back (as string)
df[r,'created_at'] = as.character(v)

您可以将它们合并成两行:

r = which(df$diff==0)
df[r, 'created_at'] = as.character(as.POSIXlt(df[r, 'created_at']) + 10*60)

导致:

  id          created_at diff
   1 2020-04-08 14:30:47   89
   2 2020-04-08 14:40:47    0
   3 2020-04-08 15:30:47   78
   4 2020-04-08 15:40:47    0

使用 lubridate 包的一个可能的解决方案是首先将 created_at 变量转换为标准格式 (POSIXct),然后仅将 10 分钟添加到原始的子集数据帧,当条件 diff == 0 被验证时。

library(lubridate)

df$created_at <- ymd_hms(df$created_at)
df[df$diff == 0, "created_at"] <- df[df$diff == 0, "created_at"] + minutes(10)

输出

#   id          created_at diff
# 1  1 2020-04-08 14:30:47   89
# 2  2 2020-04-08 14:40:47    0
# 3  3 2020-04-08 15:30:47   78
# 4  4 2020-04-08 15:40:47    0

也许不是最简单的,但这个正则表达式解决方案有效:

df$created_at[df$difference == 0] <- 
  paste(sub("(^[^:]+:).*", "\1", df$created_at[df$difference == 0]), 
        as.numeric(sub(".*\d{2}:(\d{2}):\d{2}", "\1", df$created_at[df$difference == 0])) +10,
        sub(".*(:\d{2}).*$", "\1", df$created_at[df$difference == 0]), sep = "")

解释:

首先,您定位与 difference == 0 关联的日期值。对这些值应用以下操作,即

  1. 将日期分成相关的部分(分钟之前的所有内容、分钟本身、分钟之后的所有内容),
  2. 执行寻求的更改(增加 10 分钟),并且
  3. 将字符串重新粘贴在一起。

唯一复杂的因素是,为了将值 10 添加到分钟,必须将正则表达式 returns 转换为类型 numeric:

结果:

df
           created_at difference
1 2020-04-08 14:30:47         89
2 2020-04-08 14:43:55          0
3 2020-04-08 14:37:02          2
4 2020-04-08 14:51:15          0

数据:

df <- data.frame(
  created_at = c("2020-04-08 14:30:47", "2020-04-08 14:33:55", "2020-04-08 14:37:02", "2020-04-08 14:41:15"),
  difference = c(89, 0, 2, 0), stringsAsFactors = F
)