更改 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
关联的日期值。对这些值应用以下操作,即
- 将日期分成相关的部分(分钟之前的所有内容、分钟本身、分钟之后的所有内容),
- 执行寻求的更改(增加 10 分钟),并且
- 将字符串重新粘贴在一起。
唯一复杂的因素是,为了将值 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
)
我想知道是否有办法更改日期时间中特定位置的数字?
我有一个这样的数据框 [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
关联的日期值。对这些值应用以下操作,即
- 将日期分成相关的部分(分钟之前的所有内容、分钟本身、分钟之后的所有内容),
- 执行寻求的更改(增加 10 分钟),并且
- 将字符串重新粘贴在一起。
唯一复杂的因素是,为了将值 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
)