【问题标题】:Convert String of anyformat into dd-mm-yy hh:mm:ss in R将任意格式的字符串转换为 R 中的 dd-mm-yy hh:mm:ss
【发布时间】:2012-11-30 09:20:23
【问题描述】:

我正在从 csv 文件中读取日期值。因此格式会根据 csv 的日期格式而有所不同。如何将任何日期字符串转换为 dd-mm-yyy HH:mm:ss ?

编辑:

输入格式为:

dd/mm/yyyy HH:mm:ss
dd/mm/yyyy
dd-mm-yyyy HH:mm:ss
dd-mm-yyyy 

mm-dd-yyyy HH:mm:ss
mm-dd-yyyy
mm/dd/yyyy

yyyy-mm-dd HH:mm:ss
yyyy-mm-dd 

我需要将所有这些格式转换为 dd-mm-yyyy HH:mm:ss

【问题讨论】:

  • 一般情况下无法完成该任务,因为在很多情况下mmdd 无法逐案解决。可以使用greplgegexpr 解决其他一些问题。

标签: r


【解决方案1】:

查看anytime 包,它的anytime 函数就是这样做的——并且不需要格式字符串

> inputs <- c("12/07/2017 10:11:12", "12/07/2017", "12-07-2017 10:11:12", 
+             "07-12-2017", "2017-12-07 10:11:12", "2017-12-07")
> library(anytime)
> anytime(inputs)
[1] "2017-12-07 10:11:12 CST" "2017-12-07 00:00:00 CST"
[3] "2017-12-07 10:11:12 CST" "2017-07-12 00:00:00 CDT"
[5] "2017-12-07 10:11:12 CST" "2017-12-07 00:00:00 CST"
> 

但是,您不能满足同时接受 d-m-y 和 m-d-y 的要求。所以需要做出选择并在此处提供显式格式。

总的来说,我强烈建议避免歧义并坚持使用 y-m-d ISO 格式。为方便顽固的北美习惯,anytimeanydata 也接受m-d-y 订购,但很危险。

同样,只有您可以判断 3-4-5 是 4 月 3 日还是 3 月 4 日,并且您需要指定。

【讨论】:

    【解决方案2】:

    as.Date() 将字符串转换为Date 对象。您需要将其 format 参数调整为您的 csv 具有的特定格式。

    【讨论】:

    • 我之前尝试过 as.Date() .. 问题是我必须让它在不同的地方工作。所以它应该适用于所有格式。
    • @user1790894,“它应该适用于所有格式”是什么意思?您能否分享一个关于您正在使用的数据类型的原始问题的示例?
    • 输入格式会根据用户使用的 csv 文件的格式而有所不同。所以我需要将任何格式的日期转换为 dd-mm-yyy 。
    • 您是否有任何信息,例如,一组可能的格式?如果是这样,您可以尝试这些并使用不会产生错误的那个(使用try() 函数)。您能否编辑您的问题以提供一些您可能遇到的日期格式示例?
    • 我现在需要注销,如果没有其他人早点回答,我今晚会尝试查看。请注意,可能无法清楚地识别 dd/mm/yyy 和 mm/dd/yyyy - 10/12/2012 和 12/10/2012 都可以有效地解释。
    【解决方案3】:

    试试“lubridate”包。这里 A_1.csv 有两种格式。

    Data <-read.csv("Al_1.csv") # import data
    str(Data)
    a = NULL # create a null object
    library(lubridate)
    a$Date <- mdy_hm(Data$Date) # store dd/mm/yyyy HH:mm:ss objects here
    a$Price <- Data$Price # get respective values(it could by any other column)
    b = NULL
    b$Date <- mdy(Data$Date)
    b$Price <- Data$Price
    
    a <- as.data.frame(a)
    b <- as.data.frame(b)
    
    
    a <- a[is.na(a$Date)==FALSE,] # those with NA had diffrent formats remove it
    b <- b[is.na(b$Date)==FALSE,]
    
    b$Date <- as.POSIXlt(b$Date)# change your other format also to UTC
    
    
    x <- rbind(a,b)
    str(x)
    x <- ts(x)
    

    【讨论】:

    • 您可能错过了一些输入是mdy,而其他输入是dmy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2019-07-06
    • 2019-01-14
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多