首页 > 解决方案 > 在 R 中使用时区格式转换日期

问题描述

我的日期采用以下格式:-Wed Apr 25 2018 00:00:00 GMT-0700 (Pacific Standard Time)43167全部Fri May 18 2018 00:00:00 GMT-0700 (PDT)混合在 1 列中。将所有这些转换为简单YYYY-mm-dd (2018-04-13)格式的最简单方法是什么?这是专栏:

dates <- c('Fri May 18 2018 00:00:00 GMT-0700 (PDT)',
'43203',
'Wed Apr 25 2018 00:00:00 GMT-0700 (Pacific Standard Time)',
'43167','43201',
'Fri May 18 2018 00:00:00 GMT-0700 (PDT)',
'Tue May 29 2018 00:00:00 GMT-0700 (Pacific Standard Time)',
'Tue May 01 2018 00:00:00 GMT-0700 (PDT)',
'Fri May 25 2018 00:00:00 GMT-0700 (Pacific Standard Time)',
'Fri Apr 06 2018 00:00:00 GMT-0700 (PDT)','43173')

预期格式:2018-05-18, 2018-04-13, 2018-04-25, ...

标签: rdatedate-formatting

解决方案


我相信类似的问题已经被问过好几次了。但是,有一个关键点需要特别注意:

origin整数形式给出的日期(或者可以准确地转换为整数的字符串)是什么?

如果数据是从 Windows 版本的 Excel 导入的,origin = "1899-12-30"则必须使用。有关详细信息,请参阅Gabor Grothendieck 和 Thomas Petzoldt 的 R 帮助台文章中的示例部分help(as.Date)和其他应用程序部分。

对于日期时间字符串的转换,使用包中的mdy_hms()函数。lubridate此外,我使用data.table语法是为了简洁:

library(data.table)
data.table(dates)[!dates %like% "^\\d+$", new_date := as.Date(lubridate::mdy_hms(dates))][
  is.na(new_date), new_date := as.Date(as.integer(dates), origin = "1899-12-30")][]
                                                        dates   new_date
 1:                   Fri May 18 2018 00:00:00 GMT-0700 (PDT) 2018-05-18
 2:                                                     43203 2018-04-13
 3: Wed Apr 25 2018 00:00:00 GMT-0700 (Pacific Standard Time) 2018-04-25
 4:                                                     43167 2018-03-08
 5:                                                     43201 2018-04-11
 6:                   Fri May 18 2018 00:00:00 GMT-0700 (PDT) 2018-05-18
 7: Tue May 29 2018 00:00:00 GMT-0700 (Pacific Standard Time) 2018-05-29
 8:                   Tue May 01 2018 00:00:00 GMT-0700 (PDT) 2018-05-01
 9: Fri May 25 2018 00:00:00 GMT-0700 (Pacific Standard Time) 2018-05-25
10:                   Fri Apr 06 2018 00:00:00 GMT-0700 (PDT) 2018-04-06
11:                                                     43173 2018-03-14

显然,选择属于 Windows 版本 Excel 的来源的假设似乎成立。

如果只需要一个值向量Date

data.table(dates)[!dates %like% "^\\d+$", new_date := as.Date(lubridate::mdy_hms(dates))][
  is.na(new_date), new_date := as.Date(as.integer(dates), origin = "1899-12-30")][, new_date]
 [1] "2018-05-18" "2018-04-13" "2018-04-25" "2018-03-08" "2018-04-11" "2018-05-18"
 [7] "2018-05-29" "2018-05-01" "2018-05-25" "2018-04-06" "2018-03-14"

推荐阅读