如何为该数据集生成每小时的系列箱线图?

How can I generate a series boxplot per hour of day for this dataset?

鉴于下面的示例数据,我想生成一系列箱线图,每小时一个,显示 "usage" 列的分布。 我已经为这个问题苦苦挣扎了太久,我只是想不出正确的语法来将我的 datetime 变量转换为可以用作箱线图分组的正确形式。我已经尝试了几种不同的方法将其放入 POSIXct 或 POSIXlt,但即使这样做之后,我也不知道如何将它分解为小时组。

非常感谢您的帮助。

df <- read.table(text="datetime,usage,available
2016-05-25 10:00:59.000000,12,96
             2016-05-25 09:00:59.000000,8,96
             2016-05-25 08:00:59.000000,0,96
             2016-05-25 07:00:59.000000,0,96
             2016-05-25 06:00:59.000000,0,96
             2016-05-25 05:00:59.000000,0,96
             2016-05-25 04:00:59.000000,0,96
             2016-05-25 03:00:59.000000,0,96
             2016-05-25 02:00:59.000000,0,96
             2016-05-25 01:00:59.000000,0,96
             2016-05-25 00:00:59.000000,0,96
             2016-05-24 23:00:59.000000,0,96
             2016-05-24 22:00:59.000000,0,96
             2016-05-24 21:00:59.000000,0,96
             2016-05-24 20:00:59.000000,2,96
             2016-05-24 19:00:59.000000,0,96
             2016-05-24 18:00:59.000000,8,96
             2016-05-24 17:00:59.000000,15,96
             2016-05-24 16:00:59.000000,20,96
             2016-05-24 15:00:59.000000,19,96
             2016-05-24 14:00:59.000000,3,96
             2016-05-24 13:00:59.000000,6,96
             2016-05-24 12:00:59.000000,9,96
             2016-05-24 11:00:59.000000,13,96
             2016-05-24 10:00:59.000000,16,96
             2016-05-24 09:00:59.000000,11,96
             2016-05-24 08:00:59.000000,1,96
             2016-05-24 07:00:59.000000,5,96
             2016-05-24 06:00:59.000000,2,96
             2016-05-24 05:00:59.000000,0,96
             2016-05-24 04:00:59.000000,0,96
             2016-05-24 03:00:59.000000,0,96
             2016-05-24 02:00:59.000000,0,96
             2016-05-24 01:00:59.000000,0,96
             2016-05-24 00:00:59.000000,0,96
             2016-05-23 23:00:59.000000,0,96
             2016-05-23 22:00:59.000000,0,96
             2016-05-23 21:00:59.000000,0,96
             2016-05-23 20:00:59.000000,4,96
             2016-05-23 19:00:59.000000,0,96
             2016-05-23 18:00:59.000000,0,96
             2016-05-23 17:00:59.000000,0,96
             2016-05-23 16:00:59.000000,3,96
             2016-05-23 15:00:59.000000,5,96
             2016-05-23 14:00:59.000000,2,96
             2016-05-23 13:00:59.000000,18,96
             2016-05-23 12:00:59.000000,10,96
             2016-05-23 11:00:59.000000,7,96
             2016-05-23 10:00:59.000000,9,96
             2016-05-23 09:00:59.000000,1,96
             2016-05-23 08:00:59.000000,1,96
             2016-05-23 07:00:59.000000,1,96
             2016-05-23 06:00:59.000000,1,96
             2016-05-23 05:00:59.000000,1,96
             2016-05-23 04:00:59.000000,1,96
             2016-05-23 03:00:59.000000,1,96
             2016-05-23 02:00:59.000000,1,96
             2016-05-23 01:00:59.000000,1,96
             2016-05-23 00:00:59.000000,1,96", sep=",", header=T)

例如

df <- read.table(sep=",", header=T, text="
datetime,usage,available
2016-05-25 10:00:59.000000,12,96
2016-05-25 09:00:59.000000,8,96
2016-05-25 08:00:59.000000,0,96
2016-05-25 07:00:59.000000,0,96
2016-05-25 06:00:59.000000,0,96
2016-05-25 05:00:59.000000,0,96
2016-05-25 04:00:59.000000,0,96
2016-05-25 03:00:59.000000,0,96
2016-05-25 02:00:59.000000,0,96
2016-05-25 01:00:59.000000,0,96
2016-05-25 00:00:59.000000,0,96
2016-05-24 23:00:59.000000,0,96
2016-05-24 22:00:59.000000,0,96
2016-05-24 21:00:59.000000,0,96
2016-05-24 20:00:59.000000,2,96
2016-05-24 19:00:59.000000,0,96
2016-05-24 18:00:59.000000,8,96
2016-05-24 17:00:59.000000,15,96
2016-05-24 16:00:59.000000,20,96
2016-05-24 15:00:59.000000,19,96
2016-05-24 14:00:59.000000,3,96
2016-05-24 13:00:59.000000,6,96
2016-05-24 12:00:59.000000,9,96
2016-05-24 11:00:59.000000,13,96
2016-05-24 10:00:59.000000,16,96
2016-05-24 09:00:59.000000,11,96
2016-05-24 08:00:59.000000,1,96
2016-05-24 07:00:59.000000,5,96
2016-05-24 06:00:59.000000,2,96
2016-05-24 05:00:59.000000,0,96
2016-05-24 04:00:59.000000,0,96
2016-05-24 03:00:59.000000,0,96
2016-05-24 02:00:59.000000,0,96
2016-05-24 01:00:59.000000,0,96
2016-05-24 00:00:59.000000,0,96
2016-05-23 23:00:59.000000,0,96
2016-05-23 22:00:59.000000,0,96
2016-05-23 21:00:59.000000,0,96
2016-05-23 20:00:59.000000,4,96
2016-05-23 19:00:59.000000,0,96
2016-05-23 18:00:59.000000,0,96
2016-05-23 17:00:59.000000,0,96
2016-05-23 16:00:59.000000,3,96
2016-05-23 15:00:59.000000,5,96
2016-05-23 14:00:59.000000,2,96
2016-05-23 13:00:59.000000,18,96
2016-05-23 12:00:59.000000,10,96
2016-05-23 11:00:59.000000,7,96
2016-05-23 10:00:59.000000,9,96
2016-05-23 09:00:59.000000,1,96
2016-05-23 08:00:59.000000,1,96
2016-05-23 07:00:59.000000,1,96
2016-05-23 06:00:59.000000,1,96
2016-05-23 05:00:59.000000,1,96
2016-05-23 04:00:59.000000,1,96
2016-05-23 03:00:59.000000,1,96
2016-05-23 02:00:59.000000,1,96
2016-05-23 01:00:59.000000,1,96
2016-05-23 00:00:59.000000,1,96")
boxplot(df$usage~as.POSIXlt(df$datetime)$hour)

给予