导入具有不同日期类型的Excel文件

时间:2017-12-07 15:37:32

标签: r date

有很多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

2 个答案:

答案 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")来标识每种格式的行。