R中的strptime错误:输入字符串太长

lvmkulzt  于 2023-05-20  发布在  其他
关注(0)|答案(4)|浏览(143)

我似乎无法将我的数据从csv转换为适当的日期类。我使用的是1033个日期的csv。我已将CSV保存为“YYYYMMDD”格式
下面是导入csv的代码(看起来可以工作):

bd <- read.csv('birthdaysExample.csv', 
           header = FALSE, 
           sep = ',')

我可以在R Studio中看到数据:

> head(bd)
        V1
1 20141125
2 20140608
3 20140912
4 20140526
5 20140220
6 20140619

然而,当我尝试转换日期时,我收到错误:“Strptime(bd,format =“%Y%m%d”)中的错误:输入字符串太长。"
下面是我的代码:

better_bds <- strptime(bd,format='%Y%m%d')

我甚至试着检查和验证我所有的日期实际上都有8个字符:

> table(nchar(bd$V1) != 8 | nchar(bd$V1) != 8)

FALSE 
1033

所以我不知道下一步该往哪里走,如果有人能给我指出正确的方向,我将不胜感激!

4uqofj5v

4uqofj5v1#

问题是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)"

在将bd的字符向量列传递给strptime之前,需要将其子集化(正如Hugh在他的评论中建议的那样)。

strptime(bd[,1], format="%Y%m%d")

另外,由于您似乎没有任何实际的时间信息,我建议您使用Date类。这将防止您遇到任何潜在的时区问题。

as.Date(as.character(bd[,1]), format="%Y%m%d")
iibxawm4

iibxawm42#

你的实际日期格式必须与strptime函数中的日期格式同步。示例如下:

> x <- c("2006-01-08", "2006-08-07")
> strptime(x, "%Y-%m-%d")
[1] "2006-01-08" "2006-08-07"

> y <- c("2006/01/08", "2006/08/07")
> strptime(y, "%Y/%m/%d")
[1] "2006-01-08" "2006-08-07"

如果您尝试不同,它将显示错误:

> x <- c("2006-01-08", "2006-08-07")
> strptime(x, "%Y/%m/%d")
[1] NA NA

> y <- c("2006/01/08", "2006/08/07")
> strptime(y, "%Y-%m-%d")
[1] NA NA

> x <- c("20060108", "20060807")
> strptime(x, "%Y-%m-%d")
[1] NA NA
> x <- c("20060108", "20060807")
> strptime(x, "%Y-%m-%d")
[1] NA NA

希望这能帮上忙。

3hvapo4f

3hvapo4f3#

你可以试试

better_bds <- sapply(bd,function(x) strptime(x,format='%Y%m%d'))

用你输入的数据,我得到

> better_bds
$V1
[1] "2014-11-25 CET"  "2014-06-08 CEST" "2014-09-12 CEST" "2014-05-26 CEST" "2014-02-20 CET"  "2014-06-19 CEST"
scyqe7ek

scyqe7ek4#

以下是dplyr方法:
1.重新创建示例

bd <- structure(list(V1 = c(20141125L, 20140608L, 20140912L, 20140526L,
                            20140220L, 20140619L)), .Names = "V1", class = "data.frame",
                row.names = c(NA, -6L))

as.character(bd)

bd

1.回答

library(dplyr)

better_bds <- bd %>%
  mutate_at('V1', as.numeric) %>%
  mutate(Date = as.Date(paste(V1, sep = "-"), "%Y%m%d"))

better_bds

相关问题