从字符串中提取数字作为R中的数字或日期
Posted
技术标签:
【中文标题】从字符串中提取数字作为R中的数字或日期【英文标题】:Extract numbers from string as numeric or dates in R 【发布时间】:2014-10-28 15:56:02 【问题描述】:我正在处理一些 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 将这些日期识别为字符而不是日期。我需要将它们转换为我可以使用的时间序列。
【问题讨论】:
只是为了澄清一下,您想将当前是字符串的Date转换为日期对象吗? 是的 DMT。对于列表,我提取了它们,例如“2007-10-02”“2007-10-04”“2007-10-07”。我需要将这些提取的日期转换为 R 将其识别为日期而不仅仅是字符的格式。 【参考方案1】:看来您已经完成了所有艰苦的工作!根据您的评论,以下是您如何将其带过终点线的方法。
从您的评论来看,您的字符串格式似乎不错。鉴于您的变量名为日期,只需执行
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 方法,例如合并和窗口。
【讨论】:
感谢 DMT。当我使用 as.Date 提示时,它仍然使用一种方法保留引号,而使用另一种方法时,一旦我与其他列绑定,日期看起来就会像“15432”这样的数字。 @JokeO。不知道你所说的逗号是什么意思,你能举一个输入和输出的例子吗?这可能意味着您需要指定格式。 R 中的日期对象也存储为整数,即从 R 中的种子日期(即 1970-01-01)算起的天数。这仍然是你的约会。如果你运行 class(yourVariable),你会看到。 它返回“2012-04-16”,其中 R 识别为类字符,而不是数字或日期。我如何确保它不会从设定的种子日期转换为天数?我希望创建一个以日期为列的时间序列 嗨 DMT,我刚刚在问题中添加了更多信息。希望对您有所帮助。 @JokeO。刚刚添加了一个制作时间序列的例子,你就差不多了。希望上面是一个错字,您的意思是日期为行的时间序列,这通常是它们的表示方式【参考方案2】:这是一种不使用字符串提取的方法。如果您知道时间序列应该有多长,您应该根据数据集的长度和对其周期性的了解,您可以创建一个常规日期序列,然后将其添加到具有其他感兴趣变量的 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 ...
【讨论】:
好主意,miles2know。不幸的是,日期是随机的,有些季节每天有一些数据,每周有 3 次数据,所以我不能只生成一个序列。它必须是从文件中提取的星期二日期。 嗨 Miles2know,我刚刚在问题中添加了更多信息。希望它有助于更好地表达我的需求。 嗨...我还注意到上面您谈到了使用 cbind。这实际上适用于必须是原子的类似矩阵的结构(所有相同的数据类型)。因此,当您 cbind 日期和数字时,它会将您的日期强制转换为数字。如果您需要组合不同的数据类型,您最好使用 data.frame...以上是关于从字符串中提取数字作为R中的数字或日期的主要内容,如果未能解决你的问题,请参考以下文章