Как читать в метках времени формата% Y-% m-% d% H:% M:% OS3 (и делать с ним математику)? - PullRequest
1 голос
/ 10 октября 2019

У меня есть файл .txt (без четкого разделителя столбцов), который в каждой строке содержит временную метку в формате% H-% m-% d% H:% M:% OS3 (например, «2019-09»-26 07: 29: 22,778 ") и строка символов события. Я хотел бы прочитать данные и составить таблицу, которая показывает неповрежденную временную метку в одном столбце, событие во втором и в третьем временную шкалу в формате времени OS3 (например, «1,230» или «1230» с) между событием в строке 1 и событием в строке 2, затем между событием в строке 1 и событием в строке 3 и т. д.

Я попытался прочитать файл после использования "[" в качестверазделитель в Excel и сохранение в формате .tsv, что является неудовлетворительным обходным путем. Однако дальнейшее использование функции dplyr difftime не приводит к результату, содержащему миллисекунды, хотя глобальные параметры были установлены на 3 цифры секунды («options (digits.secs = 3)»).

как выглядит .txt:

2019-09-26 17:54:24,406 [218] INFO  - [1] - Event X
2019-09-26 17:54:24,431 [207] INFO  - [1] - Event Y
2019-09-26 17:54:24,438 [218] INFO  - [1] - Event Z
...
.
.

что бы я хотел получить:

timestamp                   event            timediff in sec
2019-09-26 17:54:24,406     Event X
2019-09-26 17:54:24,431     Event Y          0.025
2019-09-26 17:54:24,438     Event Z          0.032
...
.
.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы можете использовать [в качестве разделителя и читать текстовый файл, используя read.delim. Проблема с 3 цифрами связана с тем, что вы используете запятую в качестве разделителя, а не точку. Это можно исправить с помощью str_replace (или gsub)

library(dplyr)
library(stringr)

my_df <- read.delim(text = "
2019-09-26 17:54:24,406 [218] INFO  - [1] - Event X
2019-09-26 17:54:24,431 [207] INFO  - [1] - Event Y
2019-09-26 17:54:24,438 [218] INFO  - [1] - Event Z", 
sep = "[", header = FALSE, col.names = c("timestamp", "info", "event"))

my_df
#                 timestamp          info         event
# 1 2019-09-26 17:54:24,406  218] INFO  -  1] - Event X
# 2 2019-09-26 17:54:24,431  207] INFO  -  1] - Event Y
# 3 2019-09-26 17:54:24,438  218] INFO  -  1] - Event Z

my_df %>% 
  # drop the info column
  select(-info) %>% 
  mutate(# remove anything not related to the Event
         event = str_remove(event, ".*Event"), 
         # replace , with .
         timestamp = str_replace_all(timestamp, ",", "."),
         # transform to a proper timestamp
         timestamp = as.POSIXct(timestamp, format="%Y-%m-%d %H:%M:%OS"), 
         # calculate difftime (as proposed in your previous question [1])
         difftime = difftime(timestamp, timestamp[1], unit = 'sec'))
#                 timestamp event        difftime
# 1 2019-09-26 17:54:24.405     X 0.00000000 secs
# 2 2019-09-26 17:54:24.430     Y 0.02500010 secs
# 3 2019-09-26 17:54:24.437     Z 0.03200006 secs

[1] Как создать столбец временного интервала на основе столбца отметки времени?

1 голос
/ 10 октября 2019

Вот, пожалуйста,

df <- data.table::fread(text = "2019-09-26 17:54:24,406 [218] INFO  - [1] - Event X
2019-09-26 17:54:24,431 [207] INFO  - [1] - Event Y
2019-09-26 17:54:24,438 [218] INFO  - [1] - Event Z", sep = "[", header = FALSE) # [ seems most convenient to use as sep
colnames(df) <- c("timestamp", "garbage", "event")

df
#>                  timestamp      garbage        event
#> 1: 2019-09-26 17:54:24,406 218] INFO  - 1] - Event X
#> 2: 2019-09-26 17:54:24,431 207] INFO  - 1] - Event Y
#> 3: 2019-09-26 17:54:24,438 218] INFO  - 1] - Event Z

library(dplyr)
library(stringr)


df_clean <- df %>% 
  select(-garbage) %>% 
  mutate(timestamp = str_replace(timestamp, ",", ".")) %>%  # comma must be replaced so milliseconds are recognised
  mutate(timestamp = as.POSIXct(timestamp, format = "%Y-%m-%d %H:%M:%OS"),
         event = str_extract(event, "Event.*"),
         start_time = min(timestamp), # adding the first timestamp as new column, could be removed later
         "timediff in sec" = as.numeric(timestamp - start_time, units = "secs")) # this converts difftime to numeric


df_clean
#>             timestamp   event          start_time timediff in sec
#> 1 2019-09-26 17:54:24 Event X 2019-09-26 17:54:24      0.00000000
#> 2 2019-09-26 17:54:24 Event Y 2019-09-26 17:54:24      0.02500010
#> 3 2019-09-26 17:54:24 Event Z 2019-09-26 17:54:24      0.03200006

Создано в 2019-10-10 с помощью пакета представительства (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...