将日期时间字符串解析为Date类的最快方法

19

我有一个包含日期的列,格式为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 函数。 - Dinesh.hmn
1
这是用于计算还是报告。你的两行代码返回等效的向量,至少对我来说是这样的。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) - emilliman5
抱歉,请尝试使用 strptime - Dinesh.hmn
我还建议一个重复的问题: 有没有一个快速的日期解析器?。那里的答案建议使用fasttime包大约可以加快2倍速度。 - Gregor Thomas
3
as.Date("10/17/2017 12:00:00 AM", format = "%m/%d/%Y") 就足够了。"每个输入字符串都会根据指定的格式进行必要的处理:任何尾随字符都将被忽略。" - Henrik
显示剩余5条评论
2个回答

20
请注意,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 

0

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

我需要将其保留为“日期”以进行进一步的操作,因此最终转换使用“as.Date()”。 - phil_t
我明白了,这个问题并不是完全清楚。我忽略了你最初将数据存储为“字符”而不是“日期”,所以使用@Henriks的解决方案是有道理的。 - tobiasegli_te

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接