【问题标题】:Convert an irregular time series M-D-Y hh:mm:ss to regular TS filling with NA将不规则时间序列 M-D-Y hh:mm:ss 转换为用 NA 填充的规则 TS
【发布时间】:2011-06-29 19:49:21
【问题描述】:

我已经阅读了以前的帖子,但我无法获得我想要的。我需要每天获得一个有 16 个间隔的系列(至少是第一天和最后一天,在这些情况下,间隔从第一次/最后一次观察开始/结束)。我希望观察到的变量位于相应的区间中,否则位于 NA 中。

我的数据如下:[Ya 和 Yb 是观察到的变量]

mdyhms                  Ya  Yb
Mar-27-2009 19:56:47    25  58.25
Mar-27-2009 20:38:59    9   81.25
Mar-28-2009 08:00:30    9   88.75
Mar-28-2009 09:26:29    0   89.25
Mar-28-2009 11:57:01    8.5 74.25
Mar-28-2009 12:19:10    7.5 71.00
Mar-28-2009 14:17:05    1.5 70.00
Mar-28-2009 15:13:14    NA  NA
Mar-28-2009 17:09:53    4   85.50
Mar-28-2009 18:37:24    0   86.00
Mar-28-2009 19:19:23    0   50.50
Mar-28-2009 20:45:50    0   36.25
Mar-29-2009 08:44:16    4.5 34.50
Mar-29-2009 10:35:12    8.5 39.50
Mar-29-2009 11:09:13    3.67    69.00
Mar-29-2009 12:40:07    0   54.25
Mar-29-2009 14:31:48    5.33    35.75
Mar-29-2009 16:19:27    6.33    71.75
Mar-29-2009 16:43:20    7.5 64.75
Mar-29-2009 18:37:42    8   83.75
Mar-29-2009 20:01:26    6.17    93.75
Mar-29-2009 20:43:53    NA  NA
Mar-30-2009 08:42:05    12.67   88.50
Mar-30-2009 09:52:57    4.33    75.50
Mar-30-2009 12:01:32    1.83    70.75
Mar-30-2009 12:19:40    NA  NA
Mar-30-2009 14:23:37    3.83    86.75
Mar-30-2009 16:00:59    37.33   80.25
Mar-30-2009 17:19:28    10.17   77.75
Mar-30-2009 17:49:12    9.83    73.00
Mar-30-2009 20:06:00    11.17   76.75
Mar-30-2009 21:40:35    20.33   68.25
Mar-31-2009 08:11:12    18.33   69.75
Mar-31-2009 09:51:29    14.5    65.50
Mar-31-2009 11:10:41    NA  NA
Mar-31-2009 13:27:09    NA  NA
Mar-31-2009 13:44:35    NA  NA
Mar-31-2009 16:01:23    NA  NA
Mar-31-2009 16:56:14    NA  NA
Mar-31-2009 18:27:28    NA  NA
Mar-31-2009 19:17:46    NA  NA
Mar-31-2009 21:12:22    NA  NA
Apr-01-2009 08:35:24    2.33    60.25
Apr-01-2009 09:24:49    1.33    71.50
Apr-01-2009 11:28:34    5.67    62.00
Apr-01-2009 13:31:48    NA  NA
Apr-01-2009 14:52:18    NA  NA
Apr-01-2009 15:11:44    1.5 71.50
Apr-01-2009 17:00:53    3.17    84.00

谢谢!

【问题讨论】:

  • 你能在你的对象(dput(foo))上使用dput函数并复制输出吗?这使我们能够更轻松地读取数据
  • 感谢 Marek 编辑我的数据,现在我知道该怎么做了!

标签: r date time time-series


【解决方案1】:

假设您的数据框称为“数据”,我会使用xts package。它们更容易使用:

#Conversion of dates
Data$time <- as.POSIXct(Data$mdyhms,format="%b-%d-%Y %H:%M:%S")

#conversion to time series
library(xts)
TimeSeries <- xts(Data[,c("Ya","Yb")],Data[,"time"])

然后可以随后使用 TimeSeries。您不能使用正常的 ts,因为您没有定期的时间序列。在地球上,你无法捍卫你的观察之间的时间间隔是相等的。

编辑:

关于你在cmets中的言论,你可以尝试以下方法:

#Calculate the period they're into
#This is based on GMT and the fact that POSIXct gives the number of seconds
#passed since the origin. 5400 is 1/16 of 86400 seconds in a day

Data$mdyhms <- as.POSIXct(Data$mdyhms,format="%b-%d-%Y %H:%M:%S",tz="GMT")
Data$Period <- as.numeric(Data$mdyhms) %/% 5400 * 5400

#Make a new data frame with all periods in the range of the dataframe

Date <- as.numeric(trunc(Data$mdyhms,"day"))
nData <- data.frame(
    Period = seq(min(Date),max(Date)+86399,by=5400)
)
# Merge both dataframes and take the mean of values within a dataframe

nData <- merge(Data[c('Ya','Yb','Period')],nData,by="Period",all=T)
nData <- ddply(nData,"Period",mean,na.rm=T)

#Make the time series and get rid of the NaN values
#These come from averaging vectors with only NA
TS <- ts(nData[c('Ya','Yb')],frequency=16)
TS[is.nan(TS)] <- NA

【讨论】:

  • @Joris Meys Joris,关于这些观察的特征,我同意你的看法。除此之外,我希望观察到的变量位于相应的间隔(每天 16 个)中,否则为 NA(这是我的目标)。另一方面,当我应用您的建议时,我收到此错误:字符串不是标准的明确格式。谢谢!
  • @Erica:鉴于您的样本数据中的时间点,无法确定应该在哪里填写额外的 NA 观测值。每个观测值都在不同的时间点,并且没有一致性它们之间的间隔。所以没有自动的方法来做到这一点。关于错误:我使用您的示例数据进行了尝试,并且效果很好。确保 mdyhms 是一个在整个变量中以相同方式格式化的字符串,并且不要忘记先转换为 POSIXct。
  • @Erica :即使您定义间隔并将每个时间点放在它所属的间隔中,某些间隔仍然会获得 2 个数据点。因此,没有办法做到这一点。
  • @Joris Meys:正如您所指出的,某些区间有 2 个观察值。我的想法是定义区间并将观察到的变量定位在相应的区间中。当 2 个观测值位于同一区间时,请考虑 MEAN。我尝试了几种形式,但我没有做到。我想我必须手动完成。无论如何,感谢您的帮助!
  • @Erica :这已经完全不同了。这实际上比你最初的问题更可行。如果你调整这个问题,我会检查我能找到什么。
猜你喜欢
  • 2011-04-23
  • 2014-09-02
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多