首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中按日期范围添加data.frame时出现意外错误?

问在R中按日期范围添加data.frame时出现意外错误?
EN

Stack Overflow用户
提问于 2018-03-17 16:57:39
回答 1查看 488关注 0票数 0

我得到了data.frame中的投影数据(结果是将所有德国气象站的数据投影到德国的shapefile中)。但是,在我的第一步中,我想提取出begin date和end date属性在01.01.1981 ~ 31.12.2014中的所有行。因此,我确实在原始合并的data.frame上取了子集,但不知道为什么操作失败。我以csv格式(数据在这里)共享原始数据。基本上,我将保留01.01.1981 ~ 31.12.2014之间日期间隔的所有实例(我需要分析最近35年的德国天气数据)。我很确定我的代码可以处理我的数据,但最终还是失败了。有什么快速的解决办法吗?我怎样才能在R中实现这一点呢?dplyr,data.table能帮上忙吗?还有什么想法吗?谢谢

以下是数据的外观(原始数据源处于动态状态):

代码语言:javascript
复制
 Stationsname Stations_ID ID__Index Station.Identification   Width Length Station_Height River_Basin Federal_state
1         Aach           1        KL                  02783 47.8410 8.8490            478          NA            BW
2         Aach           1        RR                  70191 47.8410 8.8490            478          NA            BW
3   Aach/Hegau       10771        PE                  10771 47.8500 8.8500            480          NA            BW
4       Aachen           3        EB                  02205 50.7827 6.0941            202      803100            NW
5       Aachen           3        FF                  02205 50.7827 6.0941            202      803100            NW
6       Aachen           3        KL                  02205 50.7827 6.0941            202      803100            NW
       Begin        End ID_0 ISO  NAME_0 ID_1               NAME_1 ID_2                 NAME_2   HASC_2 CCN_2 CCA_2
1 01.01.1937 30.06.1986   86 DEU Germany    1 Baden-Württemberg   22               Konstanz DE.BW.KN     0  8335
2 01.01.1912 30.06.1986   86 DEU Germany    1 Baden-Württemberg   22               Konstanz DE.BW.KN     0  8335
3                         86 DEU Germany    1 Baden-Württemberg   22               Konstanz DE.BW.KN     0  8335
4 01.01.1951 31.03.2011   86 DEU Germany   10  Nordrhein-Westfalen  290 Städteregion Aachen DE.NW.AC     0  5334
5 01.01.1937 31.03.2011   86 DEU Germany   10  Nordrhein-Westfalen  290 Städteregion Aachen DE.NW.AC     0  5334
6 01.01.1891 31.03.2011   86 DEU Germany   10  Nordrhein-Westfalen  290 Städteregion Aachen DE.NW.AC     0  5334
     TYPE_2 ENGTYPE_2 NL_NAME_2 VARNAME_2
1 Landkreis  District        NA          
2 Landkreis  District        NA          
3 Landkreis  District        NA          
4     Kreis  District        NA          
5     Kreis  District        NA          
6     Kreis  District        NA

我在下面阅读了实验数据集:

代码语言:javascript
复制
joinedData <- read.csv(file = "~/joinedLayer_attrTabl.csv",sep = "," ,header = TRUE)
head(as.data.frame(joinedData)); tail(as.data.frame(joinedData))

这是我第一次试镜:

代码语言:javascript
复制
dateInterval <- function(x,y){joinedData[joinedData$Begin >= x 
                                         & joinedData$End <= y,]}
DATE1 <- as.Date("01-01-1981")
DATE2 <- as.Date("31-12-2014")
res <- dateInterval(DATE1,DATE2)

以下是Rstudio引发的错误:

代码语言:javascript
复制
> dateInterval <- function(x,y){joinedData[joinedData$Begin > x & joinedData$End < y, ]}
> 
> DATE1 <- as.Date("01-01-1981")
> DATE2 <- as.Date("31-12-2014")
> res <- dateInterval(DATE1,DATE2)
Warning messages:
1: In `[.data.frame`(joinedData, joinedData$Begin > x & joinedData$End <  :
  Incompatible methods ("Ops.factor", "Ops.Date") for ">"
2: In `[.data.frame`(joinedData, joinedData$Begin > x & joinedData$End <  :
  Incompatible methods ("Ops.factor", "Ops.Date") for "<"

我还尝试了以下几点:

代码语言:javascript
复制
joinedData[joinedData$Begin & joinedData$End %between% c("01.01.1981", "31.12.2014"),]

尽管如此,我还是没有得到预期的结果。为什么这个错误会发生在我身上?有什么想法吗?

输出

我将选择开始数据和结束数据在指定日期间隔内的所有行。有办法解决这个问题吗?我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-17 18:45:20

我可以在OP的代码中看到几个问题。

Prob#1:as.Date所期望的默认格式是"%Y-%m-%d" or "%Y/%m/%d"。但是代码中使用的字符(Begin、End列)的格式是%d.%m.%Y或%s-%m-%Y。因此,函数format中的默认as.Date()将无法工作。format参数应该专门提供给as.Date()函数。

创建DATE1和DATE2的正确代码应该是:

代码语言:javascript
复制
DATE1 <- as.Date("01-01-1981", format = "%d-%m-%Y")
DATE2 <- as.Date("31-12-2014", , format = "%d-%m-%Y")

Prob#2:在尝试筛选操作之前,应该将dataframe的Begin和End列更改为as.Date格式。

这2列的格式可以更改为:

代码语言:javascript
复制
joinedData$Begin = as.Date(joinedData$Begin, format = "%d.%m.%Y")
joinedData$End= as.Date(joinedData$End, format = "%d.%m.%Y")

现在,OP'2的初始方法应该能工作。

注意:个人我更喜欢使用as.POSIXlt而不是as.Date

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49339509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档