从CSV文件在Python或R中创建时间线

时间:2019-01-11 18:34:33

标签: python r csv plot timeline

我有一个包含两列的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 :(得分:0)

这里是如何将您的列表放入结构化的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

答案 1 :(得分:0)

也许我误解了这个问题, 但是您可以使用熊猫轻松读取表格。通过该选项的解析日期,列表中的日期将格式化为索引,并对条目进行排序。 正如评论中所说,随着您在列表中拥有更多的主机,您将获得第二,第三,...可搜索的coloum。 浏览列表,您可以轻松获取要搜索的主机,并以正确的方式保存它们