R的日期时间am / pm

时间:2012-02-13 00:42:20

标签: r time

我遇到了时间序列的日期时间字段的问题:

> CO1temp[163:169,]
                     Date   OPEN   HIGH    LOW      CLOSE 
163 7/11/2011 11:45:00 PM 116.30 116.30 116.09     116.18        
164 7/11/2011 11:50:00 PM 116.16 116.78 116.13     116.70      
165 7/11/2011 11:55:00 PM 116.69 116.83 116.51     116.65      
166             7/12/2011 116.65 116.79 116.44     116.50        
167 7/12/2011 12:05:00 AM 116.50 116.60 116.39     116.47         
168 7/12/2011 12:10:00 AM 116.49 116.55 116.38     116.52        
169 7/12/2011 12:15:00 AM 116.52 116.67 116.39     116.44     

正如您所见,午夜时间(第166行)显示不正确。 在创建xts对象时创建NA:

CO1 <- as.xts(CO1temp[, 2:5], order.by = as.POSIXct(CO1temp[,1],format='%m/%d/%Y %r'),frequency="5 minutes")
> CO1[163:169,]
                      OPEN   HIGH    LOW      CLOSE
2011-07-11 23:45:00 116.30 116.30 116.09     116.18
2011-07-11 23:50:00 116.16 116.78 116.13     116.70
2011-07-11 23:55:00 116.69 116.83 116.51     116.65
<NA>                116.65 116.79 116.44     116.50
2011-07-12 00:05:00 116.50 116.60 116.39     116.47
2011-07-12 00:10:00 116.49 116.55 116.38     116.52
2011-07-12 00:15:00 116.52 116.67 116.39     116.44

当我想分析这个时间序列时,这会导致更多问题。 ?strptime对此非常具体: 如果任何组件的时间分量不是午夜,则格式方法的默认值为“%Y-%m-%d%H:%M:%S”,否则为“%Y-%m-%d”。

但是我的日期时间不是标准格式。

我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是一种黑客,但它有效 您只需将“12:00:00 AM”附加到您的日期向量中:缺少小时信息的那些将被正确读取,并且在已经有小时信息的日期中它将被忽略且只有一个已经有人会阅读。

CO1 <- as.xts(CO1temp[, 2:5], 
              order.by = as.POSIXct(paste(CO1temp$Date,"12:00:00 AM", sep=" "),
                                    format='%m/%d/%Y %r'),
              frequency="5 minutes")
CO1
                      OPEN   HIGH    LOW  CLOSE
2011-07-11 23:45:00 116.30 116.30 116.09 116.18
2011-07-11 23:50:00 116.16 116.78 116.13 116.70
2011-07-11 23:55:00 116.69 116.83 116.51 116.65
2011-07-12 00:00:00 116.65 116.79 116.44 116.50
2011-07-12 00:05:00 116.50 116.60 116.39 116.47
2011-07-12 00:10:00 116.49 116.55 116.38 116.52
2011-07-12 00:15:00 116.52 116.67 116.39 116.44

话虽如此,如果您在使用strptime之后最终得到了数据帧,那么您的日期列已经是POSIXct格式,因此以下内容应该直接起作用:

as.xts(CO1temp[, 2:5], order.by = CO1temp$Date, frequency = "5 minutes")