【问题标题】:Import Excel files with different Date types导入不同日期类型的 Excel 文件
【发布时间】:2017-12-08 18:07:02
【问题描述】:

有很多 Excel 文件,都包含相同的列。其中一列称为“日期时间”。问题是,该列包含不同的格式,例如:

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 &lt;- 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

【问题讨论】:

    标签: r date


    【解决方案1】:

    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"
    

    【讨论】:

    • 谢谢,只为一部分工作(处理不同类型的日期)。但后来我仍然遇到了在 R 中导入数据的麻烦。你知道如何解决这个问题吗?
    • 我倾向于尽量避免使用 Excel 文件,你能打开它并保存为 .csv 文件吗?如果不可能,请查看readxl 包和来自xlsxread.xlsx包,我过去都使用过 - 但倾向于坚持使用readxl
    【解决方案2】:

    先把所有数据都读成char字符串,以后清理起来就方便了。

    那么我认为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") 来识别每种格式的行。

    【讨论】:

    • 我尝试将数据读取为 char 字符串,但“col_type”的唯一选项是:“skip”、“guess”、“logical”、“numeric”、“date”、“文本”或“列表”。我想我错了,但我认为那个字符 == 文本。但是值在变化,所以结果是:DateTime 41277.000601851854 和 41277.004710648151 如果我用函数 as.Date(DateTime) 将其转换回来,我得到的不是我拥有的年份,请参阅:“2083-01-05”
    • 抱歉,“文本”用于字符字符串。数字 41277.000/... 代表自 1901 年 1 月 1 日以来的天数。您可以使用 lubridate as_date("1900-01-01") + seconds(41277.000601851854 * 24 * 60 * 60) 提取日期给#[1] "2013-01-05 00:00:52 UTC"
    • 太棒了!有道理,但是当我运行您的代码时: as_date("1900-01-01") + seconds(41277.000601851854 * 24 * 60 * 60) 我得到了结果: [1] "1831-12-13 20:45:52世界标准时间"
    • 您能否发布一段简短的数据摘录?周末可能有时间玩它......
    • 当然,但我猜这不是很有趣。我在 R 中导入数据后发布了数据(使用 lubridate as_date 函数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2022-01-22
    • 2018-12-20
    • 2016-07-05
    • 2015-07-25
    相关资源
    最近更新 更多