将天气数据与R中具有不同日期范围的记录相结合

用户名

我有2个数据集-第一个具有每日天气信息,包括平均温度和发热量天数。我每天都有一套完整的天气数据。一小段天气数据如下:

weather:

weather.station | date       | temp | HDD
A               | 11/30/2013 | 30   | 35
A               | 12/01/2013 | 28   | 37

第二个数据集包含多个房屋的数据,每个房屋都有各自的日期范围,该数据显示每天的油耗。例如:

home.bills:

home.id | start.date | end.date   | electric.usage | weather.station
1       | 11/15/2013 | 12/14/2013 |  80            | A
1       | 12/15/2013 | 1/14/2014  |  85            | A
2       | 11/18/2013 | 12/15/2013 |  60            | A
2       | 12/16/2013 | 1/13/2014  |  57            | A

我正在寻找一种有效的方式来批量组合两个数据集,因此我可以将home.bills信息与天气条件进行扩展(例如,日期范围内的平均温度和日期范围内的HDD之和)。

输出可能如下所示:

output:

home.id | start.date | end.date   | electric.usage | mean.temp | sum.HDD
1       | 11/15/2013 | 12/14/2013 |  80            |   32.8    |  937
1       | 12/15/2013 | 1/14/2014  |  85            |   29.7    |  1122
2       | 11/18/2013 | 12/15/2013 |  60            |   31.7    |  944
2       | 12/16/2013 | 1/13/2014  |  57            |   28.8    |  1201

任何人都可以建议使用一种更简单的方法来连接这两个数据集吗?我知道该怎么做,不知道如何在一定的日期范围内将这两个数据结合起来。

耶洛华德

这有两种方法可以做到这一点。第一种使用sqldf但要求(?)重命名列(因为SQL不喜欢带有“。”的列名)。从概念上讲,它更简单。

weather    <- structure(list(weather.station = c("A", "A"), date = c("11/30/2013 ", "12/01/2013 "), temp = c(30, 28), HDD = c(35L, 37L)), .Names = c("weather.station", "date", "temp", "HDD"), class = "data.frame", row.names = c(NA, -2L))
home.bills <- structure(list(home.id = c(1, 1, 2, 2), start.date = c(" 11/15/2013 ", " 12/15/2013 ", " 11/18/2013 ", " 12/16/2013 "), end.date = c(" 12/14/2013 ", " 1/14/2014  ", " 12/15/2013 ", " 1/13/2014  "), electric.usage = c(80, 85, 60, 57), weather.station = c("A", "A", "A", "A")), .Names = c("home.id", "start.date", "end.date", "electric.usage", "weather.station"), class = "data.frame", row.names = c(NA, -4L))

# dates need to be Dates, not character
weather$date <- as.Date(weather$date,format="%m/%d/%Y")
home.bills$start.date <- as.Date(home.bills$start.date,format="%m/%d/%Y")
home.bills$end.date   <- as.Date(home.bills$end.date,format="%m/%d/%Y")

# sqldf does not like "." in column names!!!
colnames(weather) <- gsub(".","_",colnames(weather),fixed=T)
colnames(home.bills) <- gsub(".","_",colnames(home.bills),fixed=T)

library(sqldf)
sqldf("select a.*, avg(temp) as mean_temp, sum(HDD) as sum_HDD
      from [home.bills] a join weather b 
      on b.date>=a.start_date and b.date<=a.end_date 
        and a.weather_station=b.weather_station
      group by home_id, start_date, end_date")
#   home_id start_date   end_date electric_usage weather_station mean_temp sum_HDD
# 1       1 2013-11-15 2013-12-14             80               A        29      72
# 2       2 2013-11-18 2013-12-15             60               A        29      72

第二种使用软件包中foverlaps(...)功能data.table这是非常强大且非常快的。请注意,此解决方案几乎与@akrun几个小时前发布的解决方案相同,然后将其删除(我很想知道为什么?)。

# data.table solution
weather    <- structure(list(weather.station = c("A", "A"), date = c("11/30/2013 ", "12/01/2013 "), temp = c(30, 28), HDD = c(35L, 37L)), .Names = c("weather.station", "date", "temp", "HDD"), class = "data.frame", row.names = c(NA, -2L))
home.bills <- structure(list(home.id = c(1, 1, 2, 2), start.date = c(" 11/15/2013 ", " 12/15/2013 ", " 11/18/2013 ", " 12/16/2013 "), end.date = c(" 12/14/2013 ", " 1/14/2014  ", " 12/15/2013 ", " 1/13/2014  "), electric.usage = c(80, 85, 60, 57), weather.station = c("A", "A", "A", "A")), .Names = c("home.id", "start.date", "end.date", "electric.usage", "weather.station"), class = "data.frame", row.names = c(NA, -4L))

library(data.table) >= 1.9.4
# convert to data.tables and convert date to Date
setDT(weather)[,date:=as.Date(date,format="%m/%d/%Y")]
setDT(home.bills)[,(2:3):=lapply(.SD,as.Date,format="%m/%d/%Y"),.SDcols=2:3]
# need start.date and end.date in weather data.table (both = date)
weather[,c("start.date","end.date"):=list(date,date)]
setkey(home.bills,weather.station,start.date,end.date)
# calaculate overlaps
result <- foverlaps(weather,home.bills,nomatch=0)
# aggregate
result[,list(mean.temp=mean(temp),sum.HDD=sum(HDD)),
       by=list(home.id,start.date,end.date,electric.usage,weather.station)]
#    home.id start.date   end.date electric.usage weather.station mean.temp sum.HDD
# 1:       1 2013-11-15 2013-12-14             80               A        29      72
# 2:       2 2013-11-18 2013-12-15             60               A        29      72

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将天气数据与R中具有不同日期范围的记录相结合

来自分类Dev

在SQL Server中复制具有不同日期的数据

来自分类Dev

将数据框添加到R中具有相同日期的列表

来自分类Dev

尝试将具有不同日期时间戳的数据组合到最接近的日期

来自分类Dev

R中的天气数据抓取和提取

来自分类Dev

连接具有不同日期时间频率的数据框

来自分类Dev

同一数据框中具有相同日期但不同小时的多个文件

来自分类Dev

在Excel中绘制具有不同日期/时间的多个时间序列数据

来自分类Dev

将事件与天气数据匹配

来自分类Dev

使用SQL Server中不同记录的开始日期和结束日期创建具有数据范围的临时表

来自分类Dev

在R中合并两个具有不同日期格式的df

来自分类Dev

将具有相同日期的数据分组

来自分类Dev

搜集天气数据

来自分类Dev

SQL BigQuery-插入具有不同日期范围的行

来自分类Dev

如何从具有不同日期时间索引的另一个数据框中获取列值

来自分类Dev

来自不同来源的年度数据具有同一年的不同日期

来自分类Dev

使用具有不同日期格式的电话将字符串转换为日期

来自分类Dev

将日期转换为具有不同日期格式的ios的字符串?

来自分类Dev

R:将具有相同日期和属性的数据行聚合为时间序列的每周计数

来自分类Dev

如何获取不同日期之间的SQL Server中的计数数据列,并且每个日期都有时间范围?

来自分类Dev

将R中的两个数据集与条件覆盖和编码动量交易相结合

来自分类Dev

将R中的两个数据集与条件覆盖和编码动量交易相结合

来自分类Dev

合并具有不同日期时间索引的两个数据框

来自分类Dev

从具有不同日期的两个DataFrame绘制数据

来自分类Dev

Python(Pandas)如何以递增顺序合并2个具有不同日期的数据框?

来自分类Dev

熊猫合并具有不同日期和列的两个数据框

来自分类Dev

合并具有不同日期时间索引的两个数据框

来自分类Dev

将具有不同日期/变量的多行合并为一行

来自分类Dev

MySQL-将两个具有不同日期值的表与分组依据组合

Related 相关文章

  1. 1

    将天气数据与R中具有不同日期范围的记录相结合

  2. 2

    在SQL Server中复制具有不同日期的数据

  3. 3

    将数据框添加到R中具有相同日期的列表

  4. 4

    尝试将具有不同日期时间戳的数据组合到最接近的日期

  5. 5

    R中的天气数据抓取和提取

  6. 6

    连接具有不同日期时间频率的数据框

  7. 7

    同一数据框中具有相同日期但不同小时的多个文件

  8. 8

    在Excel中绘制具有不同日期/时间的多个时间序列数据

  9. 9

    将事件与天气数据匹配

  10. 10

    使用SQL Server中不同记录的开始日期和结束日期创建具有数据范围的临时表

  11. 11

    在R中合并两个具有不同日期格式的df

  12. 12

    将具有相同日期的数据分组

  13. 13

    搜集天气数据

  14. 14

    SQL BigQuery-插入具有不同日期范围的行

  15. 15

    如何从具有不同日期时间索引的另一个数据框中获取列值

  16. 16

    来自不同来源的年度数据具有同一年的不同日期

  17. 17

    使用具有不同日期格式的电话将字符串转换为日期

  18. 18

    将日期转换为具有不同日期格式的ios的字符串?

  19. 19

    R:将具有相同日期和属性的数据行聚合为时间序列的每周计数

  20. 20

    如何获取不同日期之间的SQL Server中的计数数据列,并且每个日期都有时间范围?

  21. 21

    将R中的两个数据集与条件覆盖和编码动量交易相结合

  22. 22

    将R中的两个数据集与条件覆盖和编码动量交易相结合

  23. 23

    合并具有不同日期时间索引的两个数据框

  24. 24

    从具有不同日期的两个DataFrame绘制数据

  25. 25

    Python(Pandas)如何以递增顺序合并2个具有不同日期的数据框?

  26. 26

    熊猫合并具有不同日期和列的两个数据框

  27. 27

    合并具有不同日期时间索引的两个数据框

  28. 28

    将具有不同日期/变量的多行合并为一行

  29. 29

    MySQL-将两个具有不同日期值的表与分组依据组合

热门标签

归档