0

我正在处理一些 hdf5 数据集。但是,日期存储在文件中,文件名中没有这些日期的提示。属性文件由年中的日、年中的月、月中的日和年列组成。我想提取数据为每个文件创建时间序列标识,即可用于时间序列的年月日期格式。可以在此处下载数据样本:

[ ftp://l5eil01.larc.nasa.gov/tesl1l2l3/TES/TL3COD.003/2007.08.31/TES-Aura_L3-CO_r0000006311_F01_09.he5 ]

有一个属性组文件和一个数据组文件。我使用R库“rhdf5”来探索 hdf5 文件。例如

CO1<-h5ls ("TES-Aura_L3-CO_r0000006311_F01_09.he5")
Attr<-h5read("TES-Aura_L3-CO_r0000006311_F01_09.he5","HDFEOS INFORMATION/coremetadata")
Data<-h5read("TES-Aura_L3-CO_r0000006311_F01_09.he5", "HDFEOS\SWATHS\ColumnAmountNO2\Data Fields\ColumnAmountNO2Trop")

读取时的 Attr 包含一个长字符串,唯一需要的信息是“2007-08-31”,即获取日期。我已经能够使用 Stringr 库来提取它:

regexp <- "([[:digit:]]{4})([-])([[:digit:]]{2})([-])([[:digit:]]{2})"
Date<-str_extract(Attr,pattern=regexp)

它将日期返回为:

"2007-08-31"

现在剩下的唯一问题是日期未被识别为数字或日期。如何更改此设置,因为我需要将日期与所有日期的数据绑定以创建时间序列(更像是标识符,因为数据集是不规则的),好吗?下面是从字符串中提取日期并与每个日期的 CO 值绑定后的外观示例

       Dates        CO3b        
[1,] "2011-03-01" 1.625811e+18
[2,] "2011-03-04" 1.655504e+18
[3,] "2011-03-11" 1.690428e+18
[4,] "2011-03-15" 1.679871e+18
[5,] "2011-03-17" 1.705987e+18
[6,] "2011-03-17" 1.661198e+18
[7,] "2011-03-17" 1.662694e+18
[8,] "2011-03-20" 1.520328e+18
[9,] "2011-03-21" 1.510642e+18
[10,] "2011-03-21" 1.556637e+18

但是,R将这些日期识别为字符而不是日期。我需要将它们转换为我可以使用的时间序列。

4

2 回答 2

0

看来你已经完成了所有的艰苦工作!根据您的评论,以下是您如何将其带过终点线的方法。

从您的评论来看,您的字符串格式似乎很好。鉴于您的变量名为日期,只需执行

 dateObjects<-as.Date(Date)   #where Date is your variable

并且字符串的单个值或向量(如您在评论中提供的格式)现在将是日期对象,您可以将其与 zoo 之类的库一起使用来创建时间序列。

如果您的字符串不一定采用您描述的格式,请参阅以下链接以了解如何将其他字符串格式格式化为日期。

http://www.statmethods.net/input/dates.html

给定您的示例数据框,您可以使用包 zoo 以下列方式创建时间序列。

library(zoo)
datavect<-as.zoo(df$CO3b)
index(datavect)<-as.Date(df$Date)

在这里,我们获取您的 CO 数据,将其转换为 zoo 对象,然后为每个条目分配适当的日期,将其从字符转换为日期对象。现在,如果您打印 datavect,您将看到每个数据条目都附加到一个日期。这允许您利用 zoo 方法,例如合并和窗口。

于 2014-09-07T19:52:24.593 回答
0

这是一种不使用字符串提取的方法。如果您知道您的时间序列应该有多长,您应该根据数据集的长度和对其周期性的了解,您可以创建一个常规日期序列,然后将其添加到具有其他感兴趣变量的 data.frame 中。假设您有每日数据,以下将起作用。显然你的 length.out 会有所不同。

d1 <- ISOdate(year=2007,month=8,day=31)
d2 <- as.Date(format(seq(from=d1,by="day",length.out=10),"%Y-%m-%d"))
[1] "2007-08-31" "2007-09-01" "2007-09-02" "2007-09-03" "2007-09-04" "2007-09-05" "2007-09-06" "2007-09-07" "2007-09-08" "2007-09-09"
class(d2)
[1] "Date" 

原文编辑:

我懂了。好吧,在阅读了您的新数据示例之后,以下内容对我有用。这是一个非常直接的转变。干杯

library(magrittr) # Needed for the pipe operator %>% it makes it really easy to string steps together.

    dateData

            Dates     CO3b
    1  2011-03-01 1.63e+18
    2  2011-03-04 1.66e+18
    3  2011-03-11 1.69e+18
    4  2011-03-15 1.68e+18
    5  2011-03-17 1.71e+18
    6  2011-03-17 1.66e+18
    7  2011-03-17 1.66e+18
    8  2011-03-20 1.52e+18
    9  2011-03-21 1.51e+18
    10 2011-03-21 1.56e+18

    dateData %>% sapply(class) # classes before transforming (character,numeric)

    dateData[,1] <- as.Date(dateData[,1]) # Transform to date

    dateData %>% sapply(class) # classes after transforming (Date,numeric)

    str(dateData) # one more check
    'data.frame': 10 obs. of  2 variables:
     $ Dates: Date, format: "2011-03-01" "2011-03-04" "2011-03-11" "2011-03-15" ...
     $ CO3b : num  1.63e+18 1.66e+18 1.69e+18 1.68e+18 1.71e+18 ...
于 2014-09-05T17:34:18.437 回答