Изменение числа в указанной c позиции в datetime в R - PullRequest
1 голос
/ 13 июля 2020

Я хотел бы знать, есть ли способ изменить число в указанной c позиции в datetime?

У меня есть такой фрейм данных [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

Я хотел бы изменить значение created_at для строк с diff = 0, где я хотел бы добавить 10 минут, или, возможно, изменить номер в позиции 15, добавив 1.

Желаемый результат был бы выглядят так:

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

Есть ли способ сделать это? Большое спасибо за любые предложения!

Ответы [ 4 ]

1 голос
/ 13 июля 2020

Предполагая, что столбец created_by является строкой (символом типа), вы можете преобразовать его в дату / время, добавить 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
1 голос
/ 13 июля 2020

Одно из возможных решений с использованием пакета 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
1 голос
/ 13 июля 2020

Вы можете использовать такой код:

library(dplyr)
library(lubridate)

df %>% mutate(created_at = if_else(diff == 0, created_at + minutes(1), created_at))
0 голосов
/ 13 июля 2020

Возможно, не самое простое, но это решение с регулярными выражениями работает:

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 к минутам, то, что возвращает регулярное выражение, должно быть преобразовано в тип 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
)
...