R 基于日期时间提取数据

R 基于日期时间提取数据,r,datetime,merge,lapply,R,Datetime,Merge,Lapply,我有两个数据帧: dat是包含一些POSIXlt日期的9752x8数据帧 trips.df是一个35772x28数据帧,包含每小时温度 资料 我想在dat中保存每个日期的相应温度 我试过: trips.df$temperature<-lapply(trips.df$fin, function(x){ dat_meteo[dat_meteo$Date.Heure==round(x,"hours"),7]}) 我也试过: merge(trips.df,dat_meteo[,c(1,

我有两个数据帧:

  • dat是包含一些POSIXlt日期的9752x8数据帧

  • trips.df是一个35772x28数据帧,包含每小时温度
    资料

我想在dat中保存每个日期的相应温度

我试过:

trips.df$temperature<-lapply(trips.df$fin, function(x){
   dat_meteo[dat_meteo$Date.Heure==round(x,"hours"),7]})
我也试过:

merge(trips.df,dat_meteo[,c(1,7)])
但我也犯了一个错误:

Error: cannot allocate vector of size 653.8 Mb
关于如何按日期检索dat_meteo上的数据,有什么建议吗

我在Windows 10上使用R版本3.4.0和RStudio版本1.0.143 以下是我的数据:

> head(trips.df$fin)
[1] "2013-06-25 16:34:16 EDT" "2013-06-25 16:34:16 EDT" "2013-06-26 13:00:05 EDT"
[4] "2013-06-29 12:52:21 EDT" "2013-06-29 15:34:13 EDT" "2013-06-29 17:39:29 EDT"
> dat_meteo[1870:1875,c(1,7)]
              Date.Heure Temp...C.
1870 2013-03-19 18:00:00      -1,2
1871 2013-03-19 19:00:00      -1,7
1872 2013-03-19 20:00:00      -2,1
1873 2013-03-19 21:00:00      -2,8
1874 2013-03-19 22:00:00      -3,0
1875 2013-03-19 23:00:00      -3,7

您可能需要采取稍微不同的方法并使用
data.table

trips.dt <- data.table(trips.df)
dat      <- data.table(dat)
trips.dt <- trips.dt[ , dates.a := strptime(as.POSIXct(fin,format='%m/%d/%Y %H:%M:%S'),format='%m/%d/%Y')][,dates.b := dates.a]
dat      <- dat[dates.dat.a := strptime(as.POSIXct(Date.Heure, format = '%m/%d/%Y %H:%M:%S'),format='%m/%d/%Y')][, dates.dat.b := dates.dat.a]
setkey(trips.dt, id, dates.a, dates.b)
setkey(dat , id, dates.dat.a, dates.dat.b)
combo    <- foverlaps(trips.df, dat, type = "within")

trips.dt您可能需要采取稍微不同的方法,并使用
data.table

trips.dt <- data.table(trips.df)
dat      <- data.table(dat)
trips.dt <- trips.dt[ , dates.a := strptime(as.POSIXct(fin,format='%m/%d/%Y %H:%M:%S'),format='%m/%d/%Y')][,dates.b := dates.a]
dat      <- dat[dates.dat.a := strptime(as.POSIXct(Date.Heure, format = '%m/%d/%Y %H:%M:%S'),format='%m/%d/%Y')][, dates.dat.b := dates.dat.a]
setkey(trips.dt, id, dates.a, dates.b)
setkey(dat , id, dates.dat.a, dates.dat.b)
combo    <- foverlaps(trips.df, dat, type = "within")

trips.dt确保要匹配的两个时间列具有相同的格式(
POSIXct
)。在数据帧中使用
POSIXct
格式更简单,因为
POSIXlt
格式实际上对应于命名元素的列表,而
POSIXct
是向量形式

dat_meteo$Date.Heure=as.POSIXct(dat_meteo$Date.Heure,format="%Y-%m-%d %H:%M:%S")
在trips.df中创建一列四舍五入到最接近的小时数的时间,并将其转换为
POSIXct
,因为四舍五入将
POSIXct
转换为
POSIXlt

trips.df$fin_r=as.POSIXct(round(trips.df‌​$fin,"hours"))
然后使用
合并

res=merge(trips.df,dat_meteo[,c(1,7)],by.x="fin_r",by.y ="Date.Heure")

确保要匹配的两个时间列具有相同的格式(
POSIXct
)。在数据帧中使用
POSIXct
格式更简单,因为
POSIXlt
格式实际上对应于命名元素的列表,而
POSIXct
是向量形式

dat_meteo$Date.Heure=as.POSIXct(dat_meteo$Date.Heure,format="%Y-%m-%d %H:%M:%S")
在trips.df中创建一列四舍五入到最接近的小时数的时间,并将其转换为
POSIXct
,因为四舍五入将
POSIXct
转换为
POSIXlt

trips.df$fin_r=as.POSIXct(round(trips.df‌​$fin,"hours"))
然后使用
合并

res=merge(trips.df,dat_meteo[,c(1,7)],by.x="fin_r",by.y ="Date.Heure")

确保两个时间列的格式相同,例如
POSIXct
round()
实际上似乎将
POSIXct
转换为
POSIXlt
,因此您可以像.POSIXct(round(trips.df$fin,“hours”)
那样执行
。然后您可以使用
match()
获取相应的索引或
merge
,它应该可以工作。@Lamia,谢谢您的输入。代码是什么样子的?我尝试过这种方法,但运气不佳:
merge(trips.df,dat_meteo[1,7]、by.x=as.POSIXct(round(trips.df$fin,“hours”)、by.y=dat_meteo$Date.Heure)
by.x
by.y
需要列名,而不是列本身。向trips.df添加另一列:
trips.df$finhours=as.POSIXct(round(trips.df‌​$fin,“hours”)
,然后执行
合并(trips.df,dat_meteo[,c(1,7)],by.x=“finhours”,by.y=“Date.Heure”)
。您确定
dat_meteo$Date.Heure
不是
POSIXlt
POSIXct
POSIXlt
是两种完全不同的格式。你应该在问题中包含两个数据帧的str()。这个问题很难回答,因为它缺少一个。下次请使用
dput(x)
提供工作数据。如果使用
dput()
,您使用的数据类型会立即变得明显(比
str()
更好)。您问题中打印的数据摘录既不显示数据类型,也不适合组成一个工作示例(时间/日期范围不重叠)。谢谢。请确保两个时间列的格式相同,例如
POSIXct
round()
实际上似乎将
POSIXct
转换为
POSIXlt
,因此您可以像.POSIXct(round(trips.df$fin,“hours”)
那样执行
以获得相应的索引或
合并
,它应该可以工作。@Lamia,谢谢你的输入。代码是什么样子的?我尝试过这个,但运气不好:
合并(trips.df,dat_meteo[1,7],by.x=as.POSIXct(round(trips.df$fin,“hours”)),by.y=dat_meteo$Date.Heure)
by.x
by.y
需要列名而不是列本身。向trips.df添加另一列:
trips.df$finhours=as.POSIXct(round(trips.df‌​$fin,“hours”)
,然后执行
合并(trips.df,dat_meteo[,c(1,7)],by.x=“finhours”,by.y=“Date.Heure”)
。您确定
dat_meteo$Date.Heure
不是
POSIXlt
POSIXct
POSIXlt
是两种完全不同的格式。您应该包括一个str()您的问题中的两个数据帧中的一个。这个问题很难回答,因为它缺少一个。下次,请使用
dput(x)
提供工作数据。使用
dput()
可以立即看出您使用的是什么数据类型(比
str()更好)
。问题中打印的数据摘录既不显示数据类型,也不构成工作示例(时间/日期范围不重叠)。谢谢。Thx!我不熟悉data.table。但是有一个问题,
dates.a
dates.dat.a
代表什么?什么都不代表。我或多或少只是不想覆盖原始变量。Thx!我不熟悉data.table。但是有一个问题,
dates.a
dates.dat.a
代表什么或者?没什么。我或多或少只是不想覆盖原始变量。