Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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分析格式为%m%d%Y且无前导零的时间戳_R_Date - Fatal编程技术网

R分析格式为%m%d%Y且无前导零的时间戳

R分析格式为%m%d%Y且无前导零的时间戳,r,date,R,Date,我有一个时间戳形式为%m%d%Y的数据,没有前导零 时间戳示例: 112001 1112001 所需解析 January 1 2001 January 11 2001 or November 1 2001 based on context 时间戳是按顺序排列的。是否可以解析此数据?这将是按长度对这些日期字符串进行的基本逻辑处理。您需要为“上下文”添加逻辑,因为我们不知道它们是如何构造的。我把它们放在一个向量中,例如: dates <- c(112001, 1112001) lappl

我有一个时间戳形式为%m%d%Y的数据,没有前导零

时间戳示例:

112001
1112001
所需解析

January 1 2001
January 11 2001 or November 1 2001 based on context

时间戳是按顺序排列的。是否可以解析此数据?

这将是按长度对这些日期字符串进行的基本逻辑处理。您需要为“上下文”添加逻辑,因为我们不知道它们是如何构造的。我把它们放在一个向量中,例如:

dates <- c(112001, 1112001)

lapply(dates, function(x) {

  x <- as.character(x) 

  if (nchar(x) == 6) {
    as.Date(sprintf("0%s0%s%s", substr(x,1,1), substr(x,2,2), substr(x,3,6)), format="%m%d%Y")
  } else if (nchar(x) == 7) {
    as.Date(sprintf("0%s%s%s", substr(x,1,1), substr(x,2,3), substr(x,4,7)), format="%m%d%Y")    
  } else {
    as.Date(x, format="%m%d%Y")    
  }

})

## [[1]]
## [1] "2001-01-01"
## 
## [[2]]
## [1] "2001-01-11"
dates您可以使用
strtime
从固定格式的字符串表示中提取数据。然后,您可以使用
strftime
将结果转换为不同的表示形式


您希望支持非唯一可解析的格式并决定“基于上下文”的方法并不是那么容易实现,您可能希望避免采用这种方法。

这是可能的,但我认为需要先做一些工作。这与@hrbrmstr遵循相同的前提,我认为需要这样做才能解析这些日期

> x <- c("112001", "1112001")
> x1 <- ifelse(substring(x, 1, 1) != 0, paste0(0, x), x)
> x2 <- ifelse(nchar(x1) == 7 & substring(x1, 3, 3) != 0, 
               paste0(substring(x1, 1, 2), 0, substring(x1, 3)), x1)
> library(lubridate)
> parse_date_time(x2, "mdy")
[1] "2001-01-01 UTC" "2001-01-11 UTC"
>x x1 x2库(lubridate)
>解析日期时间(x2,“mdy”)
[1] “2001-01-01 UTC”“2001-01-11 UTC”

您可能需要在前面粘贴一个零来表示一月。我在这个数据集中没有前导零。我知道,但是日期时间分析器需要01来识别一月。当我这样做的时候,我得到了十一月。你反对在前面粘贴一个零吗?是的,因为我使用了几千个数据点
lapply
,所以你会看到它们是实际的“日期”对象。我(个人)可能会使用
sapply
,但是输出看起来是数字的,我不想把事情搞混。我必须解析这些数据。由于时间戳格式的原因,strtime无法正确解析数据。那么,请准备一些恼人的编码。如果一个肮脏的黑客可以帮你,那么我会选择一些明确的方式,比如“如果(长度(数据)==6){handle 1-1-4 split}或者如果(长度(数据)==7){handle 1-2-4/2-1-4和“根据上下文决定”}或者{handle 2-2-4 split}。即使是非常灵活的
parse_date_time
或者
parse_date time2
from
lubridate
(学习)使用这种格式/要求会很困难。哈哈,差不多了。但是我得到了2012年的第一个元素,它们都应该是2001年。但是我可以告诉你,你会让我大吃一惊。好吧,好吧,引擎不会让我在多个零宽度位置插入。
parse_date_time(gsub('^=.{6,7}$),'0',perl=t,gsub('^\\d\\K(?!\\d{6}),'0',x,perl=T'),'mdy')
让人大吃一惊。你应该把它作为一个答案发布。只是为了好玩,你的答案当然更简洁了(+1)。顺便说一句,谢谢你对我的问题的反馈,你可以把它作为一个答案发布,我会投票的。@hwnd,谢谢。顺便说一句,你的正则表达式技能是一流的。