Создание шкалы времени в Python или R из файла CSV - PullRequest
0 голосов
/ 11 января 2019

У меня есть файл CSV, который содержит два столбца. Первый столбец представляет собой даты в формате %m/%d/%y, а второй столбец представляет собой комбинацию буквенно-цифровых символов в нижнем / верхнем регистре. Иногда может быть> 1 имя хоста на дату, в этом случае они разделяются комой, а также иногда имя хоста может содержать специальный символ, такой как дефис или точка.

Я бы также упомянул, что этот файл отображает день, когда хост был отключен от сети.

Вот пример:

6/7/17  ml12308sASd
8/28/17 Mloasjdiaosjd1028knsd, mlsaj19209s, asd12122sda
8/28/17 Amandas-macbook.local
9/13/18 john-deers_win.local

Я пытаюсь создать временную шкалу, показывающую, что на X день хост XYZ был отключен.

Вот мой базовый R-скрипт для отображения типа данных, который R читает мой CSV-файл:

df <-read.csv("users_per_date.csv")
colnames(df) <- c("Start","Host")

x <- typeof(df)
print(x)
[1] "list"

Любая помощь в R или Python будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Может быть, я неправильно понял вопрос, но вы легко можете прочитать таблицу, используя панд. При выборе опции parse date даты в списке форматируются как индексы, а записи сортируются по нему.

Как сказано в комментариях, чем больше у вас хостов в списке, тем больше второй, третий, ... столбец, который можно искать.

Проходя по списку, вы легко можете найти нужные вам хосты и сохранить их надлежащим образом отформатированным способом

0 голосов
/ 11 января 2019

Вот как получить ваш список в структурированном df, предполагая, что read.csv считывает все в список, структурированный аналогично моему. Если ваши данные уже имеют структуру, аналогичную той, которая изображена в образце, см. Последнюю часть этого ответа.

Очистка данных и структурирование из списка типов:

library(stringr)

#Loaded CSV Data in list
list1<-list(
"6/7/17", "ml12308sASd",
"8/28/17","Mloasjdiaosjd1028knsd", 
"mlsaj19209s", "asd12122sda",
"8/28/17","Amandas-macbook.local",
"9/13/18", "john-deers_win.local"
)

list2<-unlist(list1)

#Collapse to one string
list3<-paste(list2, collapse=' ')

#Find groups for users
users<-regmatches(list3,gregexpr("(?<=\\d\\/..\\s)(.*?)(?=(..\\/..\\/)|($))",list3, perl=T))

#Unlist to index
users<-unlist(users)

#Split individual users per group
users<-strsplit(users, "\\s+")

#Concatenate group individuals, separated with comma
for(i in 1:length(users)){
users[i]<-str_c(users[[i]], sep="", collapse=", ")
}

#Re-unlist as concatenate lsited
users<-unlist(users)

#Grab dates from main string
dates<-regmatches(list3,gregexpr("(..|.)\\/(..|.)\\/..",list3, perl=T))

#Unlist Dates
dates<-unlist(dates)

#Put into data frame
df<-data.frame(dates,users)

> df
     dates                                         users
1   6/7/17                                   ml12308sASd
2  8/28/17 Mloasjdiaosjd1028knsd, mlsaj19209s, asd12122sda
3  8/28/17                         Amandas-macbook.local
4  9/13/18                          john-deers_win.local

Агрегат на основе даты

#Ensure dates are correct class for aggregation
df$dates<-as.POSIXct(df$dates, format="%m/%d/%y")

#Aggregate based on date, paste used as function
Data_Fin <- aggregate(x = df["users"],
                      FUN=paste,
                     by = df["dates"])

> Data_Fin
       dates  users
1 2017-06-07  ml12308sASd
2 2017-08-28  Mloasjdiaosjd1028knsd, mlsaj19209s, asd12122sda, Amandas-macbook.local
3 2018-09-13  john-deers_win.local
...