在R

时间:2018-06-14 21:45:37

标签: r datetime

日期和时间在R中非常混乱。我只是想随机生成一些24小时的时钟,然后加入它们。

随机生成:

library(lubridate)

hourTime <- as.list(format(seq.POSIXt(as.POSIXct(Sys.Date()),
                                    as.POSIXct(Sys.Date()+1),
                                    by = "5 min"),
                         "%H:%M", tz="GMT"))

尝试转换为日期:

df$ARRIVALTIME <- replicate(1000, sample(hourTime, 1, replace=F))

尝试添加到上一次:

df$TRETTIME <- df$ARRIVALTIME +
    (hours(sample(1:3, 1000, replace=T)) + minutes(sample(1:60, 1000, replace=T)))

这个失败我猜是因为我没有时间格式的对象。如何将随机时间添加到ARRIVALTIME

2 个答案:

答案 0 :(得分:4)

更简单 - underlyng POSIXt要么是长格式/按元素POSIXlt(这里没用),要么是紧凑POSIXct - 这只是一个双(又名numeric) - 你可以做'数学'。

因此,无论如何都要创造时间,然后只需添加实际值:

R> now <- Sys.time()
R> set.seed(123)
R> deltas <- cumsum(rnorm(5))    # just five N(0,1), added up 
R> 
R> now
[1] "2018-06-14 16:50:36.55687 CDT"
R> 
R> now + deltas
[1] "2018-06-14 16:50:35.996404 CDT" "2018-06-14 16:50:35.766226 CDT"
[3] "2018-06-14 16:50:37.324935 CDT" "2018-06-14 16:50:37.395443 CDT"
[5] "2018-06-14 16:50:37.524731 CDT"
R> 

了解基本类型后,几乎不需要附加软件包 因为一切都在(分数)秒内工作。所以要加一小时,它是60 * 60,依此类推。附加软件包仍然有用 business-day 约定,假日和其他解析器。

您的代码段中的问题是format()会破坏Datetime对象:您要求R创建一个字符串,它就是这样做的。在那些你不再能做数学的人。因此,先做数学,然后再打印或格式化。

答案 1 :(得分:3)

使用格式函数时,会创建一个不能求和的字符变量。因此,我建议保留为POSIXt并在必要时用作角色

此外,来自lubridate的分钟小时函数会创建一个期间对象,该对象在列表中转换为数字(我不要我在这里完全理解这部分而且我无法使用列表求和。

无论如何,如果我理解得当,我已经设法通过没有列表来获得你想要的结果(你可以把结果放在一个,如果可能的话),代码:

import pandas as pd
import numpy as np
b =np.array([[1,2,3,7], [1,99,20,63] ])

df = pd.DataFrame(b.T) #just creating the dataframe


criteria = df[ df.iloc[:,1]>= 60 ]     
print(criteria)