Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将日期列表从字符格式转换为日期格式_R_Date - Fatal编程技术网

R 将日期列表从字符格式转换为日期格式

R 将日期列表从字符格式转换为日期格式,r,date,R,Date,我有一个字符格式的日期向量,我需要转换为日期格式。有些月份是缩写的,有些则不是,这是因为这个列表是网络抓取的结果。由于某些原因,以下未能转换“9月7日”(适用于其余时间): 是否有人能帮助成功转换整个列表?非常感谢 编辑:请不要回复,很明显问题确实是“t”。刚刚发现了。需要找出一种不同的方法从9月删除“t”正如您所看到的,您的gsub表达式失败,因为它从其他字符串(如“Oct”)中删除了额外的“t”字符 您可以轻松地仅修改所需的字符串: sub("Sept", "Sep", employ) 使

我有一个字符格式的日期向量,我需要转换为日期格式。有些月份是缩写的,有些则不是,这是因为这个列表是网络抓取的结果。由于某些原因,以下未能转换“9月7日”(适用于其余时间):

是否有人能帮助成功转换整个列表?非常感谢


编辑:请不要回复,很明显问题确实是“t”。刚刚发现了。需要找出一种不同的方法从9月删除“t”

正如您所看到的,您的
gsub
表达式失败,因为它从其他字符串(如“Oct”)中删除了额外的“t”字符

您可以轻松地仅修改所需的字符串:

sub("Sept", "Sep", employ)

使用
sub
代替
gsub
,因为每个向量条目只需要一个替换。

我们只能从非数字部分提取前3个字符,然后应用
作为.Date

as.Date(sub("(.{3}).*(\\d+)", "\\1 \\2", employ), format = '%B %d')
#[1] "2016-01-05" "2016-02-02" "2016-03-09" "2016-04-06" "2016-05-04"
#[6] "2016-06-01" "2016-07-06" "2016-08-03" "2016-09-07" "2016-10-05"
#[11] "2016-11-02" "2016-12-07" "2016-01-04"

不需要任何外部包,上述输出为
Date
类。

lubridate
包的
parse_Date\u time
可以处理可能格式的向量,但需要设置
exact=TRUE
以便将额外的
t
解释为字符,而不是标记:

library(lubridate)
parse_date_time(employ, c('%B %d', '%Bt %d'), exact = TRUE)
#  [1] "2016-01-05 UTC" "2016-02-02 UTC" "2016-03-09 UTC" "2016-04-06 UTC" "2016-05-04 UTC"
#  [6] "2016-06-01 UTC" "2016-07-06 UTC" "2016-08-03 UTC" "2016-09-07 UTC" "2016-10-05 UTC"
# [11] "2016-11-02 UTC" "2016-12-07 UTC" "2016-01-04 UTC"

as.Date(employ,c(rep('%B%d',8),'%Bt%d',rep('%B%d',4))
或更好,
lubridate::parse_Date_time(employ,c('%B%d','%Bt%d'),exact=TRUE)
虽然接受的答案适用于本例,但我相信这是最好的答案,因为它能处理大多数情况(只要前3个字符拼写正确)我同意。请提问者注意,您可以随时出于任何原因随意更改复选标记的分配。我必须尊重您的意见@格拉科斯,这当然是你的选择,但这个答案显然更好。
as.Date(sub("(.{3}).*(\\d+)", "\\1 \\2", employ), format = '%B %d')
#[1] "2016-01-05" "2016-02-02" "2016-03-09" "2016-04-06" "2016-05-04"
#[6] "2016-06-01" "2016-07-06" "2016-08-03" "2016-09-07" "2016-10-05"
#[11] "2016-11-02" "2016-12-07" "2016-01-04"
library(lubridate)
parse_date_time(employ, c('%B %d', '%Bt %d'), exact = TRUE)
#  [1] "2016-01-05 UTC" "2016-02-02 UTC" "2016-03-09 UTC" "2016-04-06 UTC" "2016-05-04 UTC"
#  [6] "2016-06-01 UTC" "2016-07-06 UTC" "2016-08-03 UTC" "2016-09-07 UTC" "2016-10-05 UTC"
# [11] "2016-11-02 UTC" "2016-12-07 UTC" "2016-01-04 UTC"