2016-09-16 68 views
1

如何在R中导入以下日期/时间格式示例?我愿意保留这种格式的所有信息。R:日期/时间“YYYY-MM-DDThh:mm:ss.sTZD”导入

2016-09-12T09:47:00.000+0200 

其中:

YYYY = four-digit year 
MM = two-digit month (01=January, etc.) 
DD = two-digit day of month (01 through 31) 
hh = two digits of hour (00 through 23) (am/pm NOT allowed) 
mm = two digits of minute (00 through 59) 
ss = two digits of second (00 through 59) 
s = one or more digits representing a decimal fraction of a second 
TZD = time zone designator (Z or +hh:mm or -hh:mm) 

我已经试过strptime没有成功,因为我无法找到如何匹配sTZD,例如:

> strptime("2016-09-12T09:47:00.000+0200", format = '%Y-%m-%dT%H:%M:%S.000%z') 
[1] "2016-09-12 09:47:00 

回答

2

要匹配的小数第二个(来自实施例中的文档?strptime)使用:

format = '%Y-%m-%dT%H:%M:%OS%z' 

然后,看到了3位:

op <- options(digits.secs = 3) 
strptime("2016-09-12T09:47:00.123+0200", format = '%Y-%m-%dT%H:%M:%OS%z') 
##[1] "2016-09-12 03:47:00.123" 

要返回没有看到3位:

options(op) 

我相信这并分析从UTC偏移量(即, +0200)。我在美国东海岸,它是EDT(-0400)。因此,我落后了6个小时(+0200),因此09:47:00.123+0200变成03:47:00.123 EDT。

+0

哇,谢谢!我错过了%OS ...我怎么能确定它是GMT + 2(在我的情况下我住在法国):我必须依靠它会自动转换到当地时区的事实吗?也许我必须在结果中添加一个“GMT + 2”... – guzu92

+0

@ guzu92:是的,我相信'strptime'会根据您的语言环境自动转换为当地时间,如果它看到UTC的偏移量。我相信你可以设置语言环境,但我从来没有这样做过。 – aichao

+0

@ guzu92:我应该补充说,如果你没有在最后使用UTC偏移量(并且不使用'%z'),那么'strptime'将它解释为你的本地时间。 – aichao

2

你可以使用(很新)anytime包,它做到这一点无格式

R> anytime("2016-09-12T09:47:00.000+0200") 
[1] "2016-09-12 09:47:00 CDT" 
R> 

我可以尽量延长它也认识后TZ偏移作为底层Boost date_time代码支持它。不过,我到目前为止已沿袭R并将其解释为当地时间,它也(自动)找到本地时区。

anytime也支持分数秒自动(但你需要确保你显示它们):

R> anytime("2016-09-12T09:47:00.123456+0200") 
[1] "2016-09-12 09:47:00.123456 CDT" 
R> 

我倾向于微秒数据来工作,所以我倾向于如下图所示,以对所有六位反正。