在 R 中使用时区格式转换日期
Convert date with Time Zone formats in 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, ...
我相信类似的问题已经问过好几次了。然而,有
是一个需要特别注意的关键点:
对于以整数形式给出的日期(或者可以准确地转换为整数的字符串形式),origin
是什么?
如果数据是从 Excel 的 Windows 版本导入的,则必须使用 origin = "1899-12-30"
。有关详细信息,请参阅 help(as.Date)
和 the Other Applications section of the R Help Desk article by Gabor Grothendieck and Thomas Petzoldt 中的 示例 部分。
对于日期时间字符串的转换,使用了 lubridate
包中的 mdy_hms()
函数。此外,为了简洁起见,我使用 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
显然,选择原点属于 Excel 的 Windows 版本的假设似乎成立。
如果只需要 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"
我的日期格式如下:- 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, ...
我相信类似的问题已经问过好几次了。然而,有 是一个需要特别注意的关键点:
对于以整数形式给出的日期(或者可以准确地转换为整数的字符串形式),origin
是什么?
如果数据是从 Excel 的 Windows 版本导入的,则必须使用 origin = "1899-12-30"
。有关详细信息,请参阅 help(as.Date)
和 the Other Applications section of the R Help Desk article by Gabor Grothendieck and Thomas Petzoldt 中的 示例 部分。
对于日期时间字符串的转换,使用了 lubridate
包中的 mdy_hms()
函数。此外,为了简洁起见,我使用 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
显然,选择原点属于 Excel 的 Windows 版本的假设似乎成立。
如果只需要 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"