我似乎无法将数据从 csv 转换为正确的日期类。我使用的是包含 1033 个日期的 csv。我已将 CSV 保存为“YYYYMMDD”格式
这是我导入 csv 的代码(似乎有效):
bd <- read.csv('birthdaysExample.csv',
header = FALSE,
sep = ',')
Run Code Online (Sandbox Code Playgroud)
我可以在R Studio中看到数据:
> head(bd)
V1
1 20141125
2 20140608
3 20140912
4 20140526
5 20140220
6 20140619
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试转换日期时,我收到错误: “strptime(bd, format = "%Y%m%d") 中的错误:输入字符串太长。”
下面是我的代码:
better_bds <- strptime(bd,format='%Y%m%d')
Run Code Online (Sandbox Code Playgroud)
我什至尝试检查并验证我的所有日期实际上都有 8 个字符:
> table(nchar(bd$V1) != 8 | nchar(bd$V1) != 8)
FALSE
1033
Run Code Online (Sandbox Code Playgroud)
所以我不知道下一步该转向哪里,如果有人能指出我正确的方向,我将不胜感激!
问题是这bd是一个单列 data.frame 并且strptime需要一个字符向量。如果您不将字符向量传递给strptime,它将调用as.character(x)您传入的任何内容。调用as.character(bd)会产生您可能意想不到的结果。
bd <- structure(list(V1 = c(20141125L, 20140608L, 20140912L, 20140526L,
20140220L, 20140619L)), .Names = "V1", class = "data.frame",
row.names = c(NA, -6L))
as.character(bd)
# [1] "c(20141125, 20140608, 20140912, 20140526, 20140220, 20140619)"
Run Code Online (Sandbox Code Playgroud)
您需要在将字符向量列传bd递给之前对其进行子集化strptime(正如Hugh 在他的评论中建议的那样)。
strptime(bd[,1], format="%Y%m%d")
Run Code Online (Sandbox Code Playgroud)
另外,由于您似乎没有任何实际时间信息,我建议您使用 Date 类。这将防止您遇到任何潜在的时区问题。
as.Date(as.character(bd[,1]), format="%Y%m%d")
Run Code Online (Sandbox Code Playgroud)