从字符串中提取数字作为数字或R中的日期

时间:2014-09-04 02:15:52

标签: r dataset numeric hdf5 stringr

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

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

有属性组文件和数据组文件。 我使用 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 会将这些日期识别为字符,而不是日期。我需要将它们转换为我可以使用的时间序列。

2 个答案:

答案 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,您将看到附加到日期的每个数据条目。这允许您利用动物园方法,例如合并和窗口。

相关问题