【问题标题】:Parsing ISO8601 date and time format in R [duplicate]在R中解析ISO8601日期和时间格式[重复]
【发布时间】:2013-03-28 03:23:23
【问题描述】:

这应该很快 - 我们在 R 中解析以下格式:

2013-04-05T07:49:54-07:00

我目前的做法是

require(stringr) 
timenoT <- str_replace_all("2013-04-05T07:49:54-07:00", "T", " ") 
timep <- strptime(timenoT, "%Y-%m-%d %H:%M:%S%z", tz="UTC")

但它给出了NA

【问题讨论】:

  • %z 是以小时为单位的有符号偏移量,格式为hhmm,而不是hh:mm
  • 我明白了 - 替换“:”的最佳解决方案?

标签: r datetime


【解决方案1】:

strptime("2013-04-05 07:49:54-07:00", "%Y-%m-%d %H:%M:%S", tz="UTC")2013-04-05 07:49:54 UTC

试试

timep <- strptime(timenoT, "%Y-%m-%d %H:%M:%S", tz="UTC")

【讨论】:

  • 这是不正确的,因为时间不是 7:49:54 UTC,而是比 UTC 晚 7 小时。因此,如果您以 UTC 表示,它将比 7:49.54 提前 7 小时。
【解决方案2】:

你没有字符串替换。

NA 只是意味着整体没有工作,所以要拼凑出你的表达方式:

R> strptime("2013-04-05T07:49:54-07:00", "%Y-%m-%d") 
[1] "2013-04-05"
R> strptime("2013-04-05T07:49:54-07:00", "%Y-%m-%dT%H:%M") 
[1] "2013-04-05 07:49:00"
R> strptime("2013-04-05T07:49:54-07:00", "%Y-%m-%dT%H:%M:%S")
[1] "2013-04-05 07:49:54" 
R>

另外,由于我从未完全理解的原因——但可能与它底层的 C 库函数一起存在,%z 仅适用于输出,而不适用于输入。因此,您的 NA 很可能来自您对 %z 的使用。

【讨论】:

  • %z 适用于输入,但格式不同。 %Z 仅适用于输出。
  • 啊,是的,谢谢。我的解决方案仍然可以在没有正则表达式或 Hadley 包的情况下使用。所以根据我们的定义,我赢了。
  • 它做了所有这些事情,而且作为额外的奖励,它提供了错误的答案。 :)
【解决方案3】:

%z 是以小时为单位的带符号偏移量,格式为hhmm,而不是hh:mm。这是删除最后一个 : 的一种方法。

newstring <- gsub("(.*).(..)$","\\1\\2","2013-04-05T07:49:54-07:00")
(timep <- strptime(newstring, "%Y-%m-%dT%H:%M:%S%z", tz="UTC"))
# [1] "2013-04-05 14:49:54 UTC"

另请注意,您不必删除"T"

【讨论】:

  • 这似乎是一个过于笼统的模式。我认为这样的事情不太容易过度纠正:gsub("([+-]\\d\\d)(:)", "\\1", argvec)
  • 我需要完全相反!如何在最后一部分添加:?对我来说,它总是显示+0200,但我需要+02:00
  • @PeyM87:这样的事情应该很接近:gsub("(.*)([+-][[:digit:]]{2})([[:digit:]]{2})$", "\\1\\2:\\3", x)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多