将时间重新格式化为可以操作的数据

时间:2012-12-31 20:24:09

标签: r time formatting

我有一个数据集需要在格式化中进行大量清理,并且在某些时候我想计算研究中人们钓鱼的时间。如果捕鱼开始和停止的时间是正常格式,这将很容易,但由于某种原因,数据不是有用的十进制格式。例如,早上10:45记录为10.45,而11:10记录为11.10。

我已经尝试过让Excel用冒号替换所有句号(它不会这样做,其他人已经尝试帮助我让Excel合作)。我可以想到在R中做这个的几种方法,但我不知道如何继续。首先,如果有一些方法将小数(仅)之后的部分除以60,那么十进制格式将是有意义的。然后,10.45将是10.75并且减法将没有问题。或者,也可以编写某种简单的代码来用冒号替换句点然后(我在想?)使用类似chron包的东西来操作它。

我不知道您将如何编写这些选项中的任何一个 - 是否有人有任何建议?我认为除以60可以通过在句号前后分开碎片的功能(就像粘贴的相反)来完成,但我找不到这种功能的名称。第一个也可能比我想象的更简单,虽然第二个实际上可能会解释我对R的一个更大的问题,它试图弄清楚如何使命令具有可推广性。我理解如何强制它将10.45改为10:45,但希望我知道是否有一种格式只是说“拿XX.XX并改为XX:XX”无论实际数字是多少。但我认为有一件事情。

1 个答案:

答案 0 :(得分:4)

在没有示例的情况下,我为此提出了as.difftime

> d <- as.difftime('10.45', format='%H.%M')
> d
Time difference of 10.75 hours
> as.numeric(d)
[1] 10.75

对于您的评论,您必须确保将时间值读取为字符串。

Time.Start = c(9.10, 9.10, 9.10, 9.10, 9.10, 9.10)
Time.Stop = c(14.25, 14.25, 14.25, 14.25, 14.25, 14.25)

将它们变成字符串。首先将它们作为字符串读取会好得多,但我们可以使用sprintf来对它们进行处理:

Time.Stop <- sprintf('%.2f', Time.Stop)
Time.Start <- sprintf('%.2f', Time.Start)

然后解析并采取差异。 -正在返回类difftime的对象,与上面类似。

strptime(Time.Stop, format='%H.%M') - strptime(Time.Start, format='%H.%M')

## Time differences in hours
## [1] 5.25 5.25 5.25 5.25 5.25 5.25
## attr(,"tzone")
## [1] ""