我正在处理一些hdf5数据集。但是,日期存储在文件中,并且文件名中没有提示这些日期。属性文件包括一年中的某一天,一年中的某个月,一月中的某天和年份列。 我想提取数据来为每个文件创建时间序列标识,即可以用于时间序列的年月日期格式。 可在此处下载数据样本:
有属性组文件和数据组文件。 我使用 R 库“rhdf5”来探索hdf5文件。 E.g
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)
将Date返回为:
"2007-08-31"
现在唯一的问题是日期不被识别为数字或日期。我如何更改此项,因为我需要将Date与所有日期的数据绑定以创建时间序列(更像是标识符,因为数据集是不规则的),好吗?从字符串中提取日期并与每个日期的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 会将这些日期识别为字符,而不是日期。我需要将它们转换为我可以使用的时间序列。
答案 0 :(得分:0)
这是一种不使用字符串提取的方法。如果你知道你的时间序列应该有多长,你应该根据数据集的长度和周期性知识,你可以创建一个常规日期系列,然后将其添加到data.frame中,并附上其他感兴趣的变量。假设您有每日数据,则以下内容可行。显然你的长度会有所不同。
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 ...
答案 1 :(得分:0)
好像你已经完成了所有艰苦的工作!根据你的评论,这里是你如何把它带到终点线。
从您的评论中,您似乎拥有良好格式的字符串。鉴于您的变量名为date,只需转到
即可 dateObjects<-as.Date(Date) #where Date is your variable
并且字符串的单个值或向量(作为您在注释中给出的格式)现在将是日期对象,您可以使用像zoo这样的库来创建时间序列。
如果您的字符串不一定采用您所描述的格式,请参阅以下链接,了解如何将其他字符串格式设置为日期。
http://www.statmethods.net/input/dates.html
根据您的示例数据框,您可以使用包动物园以下列方式创建时间序列。
library(zoo)
datavect<-as.zoo(df$CO3b)
index(datavect)<-as.Date(df$Date)
这里我们获取您的CO数据,将其转换为zoo对象,然后为每个条目分配适当的日期,将其从字符转换为日期对象。现在,如果您打印datavect,您将看到附加到日期的每个数据条目。这允许您利用动物园方法,例如合并和窗口。