【问题标题】:Creating a timeline in Python or R from a CSV file从 CSV 文件在 Python 或 R 中创建时间线
【发布时间】:2019-06-06 17:03:43
【问题描述】:

我有一个包含两列的 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 的帮助将不胜感激!

【问题讨论】:

  • 数据导入R后的结构是什么?
  • 数据导入后的结构是一个列表。
  • 我看到的一个问题是您正在读取 csv,同时用逗号分隔应该存在于同一组中的变量,这些变量将在 read.csv 期间分隔。因此,您将获得一个列表[1] 6/7/17 [2] ml12308sASd [3] 8/28/17 [4] Mloasjdiaosjd1028knsd [5] mlsaj19209s [6] asd12122sda [7] 8/28/17,这会使事情变得复杂。在聚合之前,您必须弄清楚如何将其放入结构化数据框中,就像您在示例中显示的那样。
  • 我可以根据需要使用 bash 来解析它......也许是以下? cat users_per_date.csv | sed 's/,/ /g' &gt; text.txt 这将用空格替换所有逗号并转换为文本文件。这会使您想象的数据类型标准化吗?

标签: python r csv plot timeline


【解决方案1】:

假设 read.csv 将所有内容读入与我的结构类似的列表中,以下是如何将您的列表放入结构化 df 的方法。如果您的数据已经采用类似于示例中描述的结构,请参阅此答案的最后一部分。

类型列表中的数据清理和结构化:

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

【讨论】:

    【解决方案2】:

    也许我误解了这个问题,但您可以使用 pandas 轻松阅读表格。通过选项 parse dates 列表中的日期被格式化为索引并且条目被排序到它。

    正如 cmets 所说,随着您在列表中拥有的主机越多,您将获得第二、第三、...列,可以搜索。

    浏览列表,您可以轻松获取您正在搜索的主机并以适当的重新格式化方式保存它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2015-11-23
      • 2017-10-26
      • 2012-01-16
      • 2013-11-18
      相关资源
      最近更新 更多