【问题标题】:Find rows in a dataframe with a certain date using subset使用子集在具有特定日期的数据框中查找行
【发布时间】:2017-12-28 17:49:30
【问题描述】:

我有一个数据框 Date ,包含日期、时间和值:

  Date         Time         Global_active_power
  16/12/2006   17:24:00     4.216
  16/12/2006   18:25:00     4.5
  17/12/2006   17:25:00     4.52
  18/12/2006   17:25:00     4.557

现在我想根据日期查找一行 - 例如日期 > 16/12/2006 的所有行。

这是我的代码:

Data$Date<- as.Date(Data$Date,"%dd%mm%yyyy" )
Data$Time<-strptime(Data$Time, "%h%m%s")
print(class(Data$Date))
print(class(Data$Time))
Data1<-subset(Data, (Date=="16/12/2006" ))
View(Data1)

Date 和 Time 的类是 factor 和 factor 但现在它们是 Date 和 "POSIXlt" "POSIXt" 。当我执行子集命令时,Data1 为空。

为什么?它应该包含前 2 个数据集。

【问题讨论】:

  • 一方面,您的日期变量的格式不正确,as.Date(Data$Date,"%dd%mm%yyyy") 应该是as.Date(Data$Date,"%d/%m/%Y") 请参阅?strptime 中的示例。此外,当转换为 Date 变量时,您将需要使用 data$Date == as.Date("2006-12-16" ),这是 R 转换后使用的格式。

标签: r date conditional-statements subset


【解决方案1】:

Time 变量的转换存在问题。因为它没有日期,只有时间,当你申请strptime时,它会自动插入一个日期,今天。这显然不是你想要的。我认为最好的解决方案是创建一个新列,DateTime

Data$Date <- as.Date(Data$Date, "%d/%m/%Y")

# See the output date (today)
strptime(Data$Time, "%H:%M:%S")
[1] "2017-07-22 17:24:00 BST" "2017-07-22 18:25:00 BST"
[3] "2017-07-22 17:25:00 BST" "2017-07-22 17:25:00 BST"

DateTime <- paste(Data$Date, Data$Time)
DateTime
[1] "2006-12-16 17:24:00" "2006-12-16 18:25:00" "2006-12-17 17:25:00"
[4] "2006-12-18 17:25:00"

Data$DateTime <- as.POSIXct(DateTime, format = "%Y-%m-%d %H:%M:%S")

Data1 <- subset(Data, Date > as.Date("2006-12-16"))
View(Data1)

如果您想将数据/时间相关的变量放在一起,您可以交换第 3 列和第 4 列。

Data <- Data[, c(1, 2, 4, 3)]
Data
        Date     Time            DateTime Global_active_power
1 2006-12-16 17:24:00 2006-12-16 17:24:00               4.216
2 2006-12-16 18:25:00 2006-12-16 18:25:00               4.500
3 2006-12-17 17:25:00 2006-12-17 17:25:00               4.520
4 2006-12-18 17:25:00 2006-12-18 17:25:00               4.557

只有这样你才会Data1 &lt;- subset(...)

【讨论】:

    【解决方案2】:
    Data$Date<- as.Date(Data$Date,"%d/%m/%Y" ) # date format now 'yyyy-mm-dd'
    Data$Time <- as.POSIXct(strptime(Data$Time, "%H:%M:%S"))
    print(class(Data$Date))
    print(class(Data$Time))
    
    Data1 <- subset(Data, Date > "2006-12-16") 
    
    View(Data1)
    

    【讨论】:

    • 这不起作用 - 它在所有列/行中都给了我 NA
    • 因为日期时间格式不对,应该分别是"%d/%m/%Y""%H:%M:%S"
    • 我刚刚进行了应该更正的编辑。瑞是对的。我的疏忽。
    • 我也会使用 lmo 上面写的,在他对你的帖子的评论中,Date &gt; as.Date("2006-12-16")
    • 抱歉,仍然无法正常工作我收到此错误:错误:列 Time 是日期/时间,必须存储为 POSIXct,而不是 POSIXlt
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多