【问题标题】:Fastest way to parse a date-time string to class Date将日期时间字符串解析为 Date 类的最快方法
【发布时间】:2018-03-29 08:28:40
【问题描述】:

我有一个日期为字符的列,格式为10/17/2017 12:00:00 AM。我想解析字符串并仅将日期部分保留为类Date,即2017-10-17。我正在使用 -

df$ReportDate = as.Date(df$ReportDate, format = "%m/%d/%Y %I:%M:%S %p") 
df$ReportDate = as.Date(format(df$ReportDate, "%Y-%m-%d"))

这可行,但数据帧有超过 500 万行,所以这需要将近两分钟。

  user  system elapsed 
104.73    0.55  105.46 

有没有更快更有效的方法来做到这一点?

【问题讨论】:

  • 一个excel文件有超过5M行?我猜它是一个csv文件。尝试使用来自datatable 包的fread
  • 对不起,我认为我的问题不清楚。需要时间的不是读取过程,而是日期转换过程。将编辑。
  • 这是用于计算还是用于报告。您的两行代码返回等效向量,至少对我而言。 df <- rep("8/31/2017 12:30:00 pm", 5e6); df <- as.Date(df, format = "%m/%d/%Y %I:%M:%S %p"); df1 <- as.Date(format(df, "%Y-%m-%d")); all(df == df1)
  • 您可以使用 substr 仅提取日期部分 - 留下时间 - 然后在不解析时间的情况下使用 as.Date(df$ReportDate, format = "%m/%d/%Y) 可能会更快 - 我不确定。我也不确定你为什么要使用as.Date 两次。一次还不够吗?
  • as.Date("10/17/2017 12:00:00 AM", format = "%m/%d/%Y") 就足够了。 "每个输入字符串都按照指定格式进行处理:忽略任何尾随字符。"

标签: r date datetime as.date


【解决方案1】:

请注意,as.Date 将忽略日期之后的垃圾,因此在我不是特别快的笔记本电脑上这需要不到 10 秒的时间:

xx <- rep("10/17/2017 12:00:00 AM", 5000000) # test input
system.time(as.Date(xx, "%m/%d/%Y"))
## user  system elapsed 
## 9.57    0.20    9.82 

【讨论】:

    【解决方案2】:

    Date 转换为character 可能更有效:

    # Create dummy data
    date_from <- as.Date('01/01/1999  12:00:00 AM',
        format = "%m/%d/%Y %I:%M:%S %p")
    
    date_to <- as.Date('01/01/2017  12:00:00 AM',
        format = "%m/%d/%Y %I:%M:%S %p")
    
    df <- data.frame(ReportDate = sample(seq(from = date_from,
        to = date_to, by = "day"), 5000000, T))
    
    # Convert to char
    start <- Sys.time()
    df$ReportDate <- as.character(df$ReportDate)
    
    Sys.time() - start
    Time difference of 12.37254 secs
    
    head(df)
      ReportDate
    1 2011-08-04
    2 2013-11-15
    3 2002-09-08
    4 2011-07-01
    5 2011-01-22
    6 2001-01-04
    

    【讨论】:

    • 我需要将其保留为Date 以进行进一步操作,因此最终转换使用as.Date()
    • 我明白了,这个问题并不完全清楚。我忽略了您最初将数据存储为character 而不是Date,因此使用@Henriks 解决方案是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 2018-11-03
    • 2012-01-28
    相关资源
    最近更新 更多