有很多Excel文件,都包含相同的列。其中一列称为“DateTime”。问题是,该列包含不同的格式,例如:
2/12/2013 11:59:45 PM
20/2/2013 14:36:58
如您所见,第一个示例在末尾包含PM。这是我的问题:
我的代码导入特定文件夹中的所有Excel文件:
file.list <- list.files(pattern='*.xlsx')
df.list <- lapply(file.list, read_excel)
df <- bind_rows(df.list, .id = "id")
但是,在我运行第二行(df.list <- lapply(file.list, read_excel)
)后,我收到了一些警告(例如,期待数字,得到了一个日期)。
我尝试了不同的东西,例如分配col_types = "text"
(我希望我可以将所有数据导入为字符,然后更改删除最后的PM并再次将字符更改回as.Date
)。但不幸的是,结果很多NA
。
我尝试的另一件事是将文件导入为数字(但同样,收到相同的消息“期待数字,得到一个日期)。
那么我该如何解决这个问题呢?我可以通过更改Excel中的列类型来实现,但这不是我想要做的(我更喜欢在R中执行所有操作)。
修改
请求的一些数据(在我使用lubridate as_date函数将数据导入R中作为“字符”之后,如建议的那样)。
Num Date
1 41277.000601851854
2 41277.004710648151
3 41277.004826388889
4 41277.007372685184
5 41277.007789351854
6 41277.007870370369
7 41277.010335648149
8 41277.010868055557
9 41277.013842592591
10 41277.014548611114
答案 0 :(得分:2)
lubridate
具有出色的parse_date_time
功能,您可以指定日/月/年的订单以及'截断',例如允许某些格式缺少数字。
library(lubridate)
time <- c("2/12/2013 11:59:45 PM", "20/2/2013 14:36:58")
parse_date_time(time, orders = c('dmyHMS') )
[1] "2013-12-02 11:59:45 UTC" "2013-02-20 14:36:58 UTC"
答案 1 :(得分:1)
首先将所有数据作为字符串读取,之后将很容易清理。
然后我认为lubridate
包可以帮到你。我不知道您有多少文件/格式,但给出的示例可以由相同的lubridate::dmy_hms()
函数读取:
# >datim <- c("20/2/2013 14:36:58", "2/12/2013 11:59:45 PM")
# >dmy_hms(datim)
# [1] "2013-02-20 14:36:58 UTC" "2013-12-02 23:59:45 UTC"
每个时间单位排序都有一个功能。例如mdy_hm()
。如果您的时间格式有更多变化,那么在应用适当的dmy_hm()函数之前,您可以使用stringr::str_detect(your_date_variable, "date_format_regex")
来标识每种格式的行。