1

我在数据框中有大量 POSIXlt 时间,我试图查看我每天有多少次这些纪念活动(在这种情况下是骑自行车)。最好的方法是什么?

日期如下所示:

> rides$start.fmtd[1:25]
 [1] "2014-01-01 00:06:00" "2014-01-01 00:11:00" "2014-01-01 00:12:00"
 [4] "2014-01-01 00:14:00" "2014-01-01 00:15:00" "2014-01-01 00:16:00"
 [7] "2014-01-01 00:16:00" "2014-01-01 00:19:00" "2014-01-01 00:20:00"
[10] "2014-01-01 00:20:00"

dput(head())给了我这个:

> dput(head(rides$start.fmtd))
structure(list(sec = c(0, 0, 0, 0, 0, 0), min = c(6L, 11L, 12L, 
14L, 15L, 16L), hour = c(0L, 0L, 0L, 0L, 0L, 0L), mday = c(1L, 
1L, 1L, 1L, 1L, 1L), mon = c(0L, 0L, 0L, 0L, 0L, 0L), year = c(114L, 
114L, 114L, 114L, 114L, 114L), wday = c(3L, 3L, 3L, 3L, 3L, 3L
), yday = c(0L, 0L, 0L, 0L, 0L, 0L), isdst = c(0L, 0L, 0L, 0L, 
0L, 0L)), .Names = c("sec", "min", "hour", "mday", "mon", "year", 
"wday", "yday", "isdst"), class = c("POSIXlt", "POSIXt"))

这个特定的框架有大约 300,000 个观测值(它是 capitol bikeshare 数据集,包含系统中的每一次骑行,每季度打包一次)。

4

3 回答 3

2

POSIXlt有一个yday属性,你可以用它来做一个计数,使用aggregateorbytableor 这样。

例如,假设您count在 data frame中计算了一天的观察次数d,其中包含 column date。如果您的数据不超过一年,您可以yday单独使用:

aggregate(count ~ date$yday, data=d, FUN=sum)

如果它跨越一年以上(或只是为了安全起见),您还可以包括年份(任何大于 366 的乘数):

aggregate(count ~ I(1000*date$year + date$yday), data=d, FUN=sum)
于 2014-06-16T02:31:57.003 回答
2
dates <- as.POSIXlt(runif(10, 0, 60 * 60 * 24 * 7), origin = Sys.Date())
dates
## [1] "2014-06-16 03:36:13 PDT" "2014-06-15 22:39:41 PDT"
## [3] "2014-06-19 12:25:11 PDT" "2014-06-17 09:31:45 PDT"
## [5] "2014-06-20 02:20:00 PDT" "2014-06-18 04:36:48 PDT"
## [7] "2014-06-19 17:33:35 PDT" "2014-06-21 15:38:24 PDT"
## [9] "2014-06-17 08:50:45 PDT" "2014-06-20 03:36:38 PDT"

class(dates)
## [1] "POSIXlt" "POSIXt"

table(as.Date(dates))
## 2014-06-15 2014-06-16 2014-06-17 2014-06-18 2014-06-19 2014-06-20 2014-06-21
##          1          1          2          1          2          2          1
于 2014-06-16T06:22:41.707 回答
1

如果您有带有日期和时间的值,您可以将它们格式化为只有日期并在这些值上使用 table() 来获取计数。

#sample data
set.seed(15)
randomdates <- structure(runif(30, 1357016400, 1359608400), 
    class=c("POSIXct", "POSIXt"), tzone="")

现在计算每个日期的值

table(strftime(randomdates, "%Y-%m-%d"))

唯一的缺点是 table() 将日期转换为字符向量。您可以将它们转换回来

tbl<-table(strftime(randomdates, "%Y-%m-%d"))
as.POSIXct(names(tbl))
于 2014-06-16T02:29:27.077 回答