我在将POSIXct转换为字符并返回到R中的POSIXct时遇到问题.我运行以下代码:
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10)
time_seq_02 <- as.character(time_seq_01)
time_seq_03 <- as.POSIXct(time_seq_02)
Run Code Online (Sandbox Code Playgroud)
或同等学历:
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10)
time_seq_02 <- format(time_seq_01,usetz = TRUE)
time_seq_03 <- as.POSIXct(time_seq_02)
Run Code Online (Sandbox Code Playgroud)
这是2012年从中欧夏令时(CEST)到中欧时间(CET)的夏令时转换(10月02:00 - 03:00的最后一个星期日)的时间戳.
当我把这些元素称为时,我得到了
time_seq_01
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST"
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST"
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET"
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET"
[9] "2012-10-28 03:00:00 CET" "2012-10-28 …Run Code Online (Sandbox Code Playgroud) 我正在操作一些POSIXltDateTime对象.例如,我想添加一个小时:
my.lt = as.POSIXlt("2010-01-09 22:00:00")
new.lt = my.lt + 3600
new.lt
# [1] "2010-01-09 23:00:00 EST"
class(new.lt)
# [1] "POSIXct" "POSIXt"
Run Code Online (Sandbox Code Playgroud)
事情是我想new.lt成为一个POSIXlt对象.我知道我可以用as.POSIXlt它来转换回来POSIXlt,但有没有更优雅和有效的方法来实现这一目标?
您好我正在寻找一种有效的方法来选择POSIXct行,data.table以便一天中的时间少于说12:00:00(注意毫秒不是必需的,所以我们可以使用ITime例如)
set.seed(1); N = 1e7;
DT = data.table(dts = .POSIXct(1e5*rnorm(N), tz="GMT"))
DT
dts
# 1: 1969-12-31 06:35:54.618925
# 2: 1970-01-01 05:06:04.332422
# ---
# 9999999: 1970-01-03 00:37:00.035565
#10000000: 1969-12-30 08:30:23.624506
Run Code Online (Sandbox Code Playgroud)
一个解决方案(这里的问题是,如果N很大,演员阵容会很昂贵)
f <- function(t, st, et) {time <- as.ITime(t); return(time>=as.ITime(st) & time<=as.ITime(et))}
P <- function(t, s) { #geekTrader solution
ep <- .parseISO8601(s)
if(grepl('T[0-9]{2}:[0-9]{2}:[0-9]{2}/T[0-9]{2}:[0-9]{2}:[0-9]{2}', s)){
first.time <- as.double(ep$first.time)
last.time <- as.double(ep$last.time)-31449600
SecOfDay <- as.double(t) %% 86400
return(SecOfDay >= first.time & SecOfDay <= last.time …Run Code Online (Sandbox Code Playgroud) 我有一个data.table(约3000万行)由一datetime列POSIXct格式,一id列和一些其他列组成(在这个例子中,我只留下一个不相关的列x来证明存在其他需要保留的列).A dput位于帖子的底部.
head(DT)
# datetime x id
#1: 2016-04-28 16:20:18 0.02461368 1
#2: 2016-04-28 16:41:34 0.88953932 1
#3: 2016-04-28 16:46:07 0.31818101 1
#4: 2016-04-28 17:00:56 0.14711365 1
#5: 2016-04-28 17:09:11 0.54406602 1
#6: 2016-04-28 17:39:09 0.69280341 1
Run Code Online (Sandbox Code Playgroud)
问:对于每一个id,我需要仅对那些相差超过30分钟的观察进行子集化.什么是有效的data.table方法来做到这一点(如果可能的话,没有广泛的循环)?
逻辑也可以描述为(如下面的评论):
每个id始终保留第一行.在第一行之后至少30分钟的下一行也应保留.让我们假设要保留的行是第4行.然后,计算第4行和第5行之间的时间差:n并保持第一个相差超过30分钟,依此类推
在下面的dput中,我添加了一个列,keep用于指示在此示例中应保留哪些行,因为它们与每个id保留的上一个观察值相差超过30分钟.困难在于似乎有必要迭代地计算时间差(或者至少,我现在想不到更有效的方法).
library(data.table)
DT <- structure(list(
datetime = structure(c(1461853218.81561, 1461854494.81561,
1461854767.81561, 1461855656.81561, 1461856151.81561, 1461857949.81561,
1461858601.81561, 1461858706.81561, 1461859078.81561, 1461859103.81561,
1461852799.81561, 1461852824.81561, 1461854204.81561, 1461855331.81561,
1461855633.81561, 1461856311.81561, …Run Code Online (Sandbox Code Playgroud) 我想减去POSIXct.我可以这样做,但取决于第一行(我猜?),差异将以秒或分钟为单位.下面你可以看到第一个差异以秒为单位,第二个差异以分钟为单位,因为我改变了第一行的时差:
#diff in seconds because 1st row time diff is small?
t1<- as.POSIXct(c("2015-02-02 20:18:03 00:00:00", "2015-02-02 20:17:02 00:00:00"),"GMT")
t2<- as.POSIXct(c("2015-02-02 20:18:02 00:00:00","2015-02-02 20:18:02 00:00:00"),"GMT")
d<-data.frame(t1= t1, t2= t2)
d$t1-d$t2
#diff in seconds because 1st row time diff is larger?
t1<- as.POSIXct(c("2015-02-02 20:13:03 00:00:00", "2015-02-02 20:17:02 00:00:00"),"GMT")
t2<- as.POSIXct(c("2015-02-02 20:18:02 00:00:00","2015-02-02 20:18:02 00:00:00"),"GMT")
d<-data.frame(t1= t1, t2= t2)
d$t1-d$t2
Run Code Online (Sandbox Code Playgroud)
结果:
> #diff in seconds because 1st row time diff is small?
> t1<- as.POSIXct(c("2015-02-02 20:18:03 00:00:00", "2015-02-02 20:17:02 00:00:00"),"GMT")
> t2<- as.POSIXct(c("2015-02-02 …Run Code Online (Sandbox Code Playgroud) 这是我的数据框中包含的信息:
## minuteofday: factor w/ 89501 levels "2013-06-01 08:07:00",...
## dDdt: num 7.8564 2.318 ...
## minutes: POSIXlt, format: NA NA NA
Run Code Online (Sandbox Code Playgroud)
我需要将分钟列转换为日期/时间格式:
minuteave$minutes <- as.POSIXlt(as.character(minuteave$minuteofday), format="%m/%d/%Y %H:%M:%S")
Run Code Online (Sandbox Code Playgroud)
我试过了as.POSIXlt,as.POSIXct而且as.Date.这些都没有奏效.有人有想法吗.
目标是绘制分钟与dDdt的关系,但它不会让我在指定的时间段内绘制我想要的因素.我不知道接下来该尝试什么...
如何正确解析毫秒?
as.POSIXct 功能在我的环境中如下工作.
> as.POSIXct("2014-02-24 11:30:00.001")
[1] "2014-02-24 11:30:00.000 JST"
> as.POSIXct("2014-02-24 11:30:00.0011")
[1] "2014-02-24 11:30:00.001 JST"
我的R版本是适用于Windows的x86 v3.0.2.
我有一个带有开始和结束时间的数据框:
id start_time end_time
1 1 2018-09-02 11:13:00 2018-09-02 11:54:00
2 2 2018-09-02 14:34:00 2018-09-02 14:37:00
3 3 2018-09-02 03:00:00 2018-09-02 03:30:00
4 4 2018-09-02 03:49:00 2018-09-02 03:53:00
5 5 2018-09-02 07:05:00 2018-09-02 08:05:00
6 6 2018-09-02 06:44:00 2018-09-02 06:57:00
7 7 2018-09-02 06:04:00 2018-09-02 08:34:00
8 8 2018-09-02 07:51:00 2018-09-02 08:15:00
9 9 2018-09-02 08:16:00 2018-09-02 08:55:00
Run Code Online (Sandbox Code Playgroud)
从这些时间段,我如何计算每天每小时发生的总分钟数?例如,如果一个时段从 9:45 开始并在 10:15 结束,我想将 15 分钟分配给 9:00 小时,将 15 分钟分配给 10:00 小时。
或者检查06上面数据中的小时,该小时包含在两个不同的行(句点)中:
6 6 2018-09-02 06:44:00 2018-09-02 06:57:00 …Run Code Online (Sandbox Code Playgroud) 我有一个csv,其中包含大约200万行日期字符串格式:
2012/11/13 21:10:00
Run Code Online (Sandbox Code Playgroud)
让我们称呼它 csv$Date.and.Time
我想尽快将这些日期(及其附带的数据)转换为xts
我编写了一个脚本,可以很好地执行转换(见下文),但它非常慢,我想尽可能加快速度.
这是我目前的方法.有没有人对如何加快速度提出任何建议?
dt <- as.POSIXct(csv$Date.and.Time,tz="UTC")
idx <- format(dt,tz=z,usetz=TRUE)
Run Code Online (Sandbox Code Playgroud)
因此脚本将这些日期字符串转换为POSIX.ct.然后使用format(z是表示我要转换的TZ的变量)进行时区转换.然后我做一个常规xts调用,使其成为xts系列,其中包含csv中的其余数据.
这100%工作.它非常非常慢.我试过并行运行它(它没有做任何事情;如果有什么事情让它变得更糟)."慢"是什么意思?
user system elapsed
155.246 16.430 171.650
Run Code Online (Sandbox Code Playgroud)
这是一款3GhZ,16GB RAM 2012 mb pro.我可以在Win7机器上使用32GB RAM的类似处理器上获得大约一半
我确信有人有更好的想法 - 我愿意接受建议Rcpp等等.但是,理想情况下,解决方案适用于csv而不是其他一些方法,比如设置数据库.话虽如此,我愿意通过任何方法来实现这一目标,以实现最快的转换.
我非常感谢任何帮助.提前致谢.
我有一个数据文件,其中有三列:
20010101 000000 0.833
20010101 000500 0.814
20010101 001000 0.794
20010101 001500 0.772
...
Run Code Online (Sandbox Code Playgroud)
人眼相当清楚,前两个是日期和时间.我需要将它们转换为POSIXct(如果它更好的话,还是其他的东西,但我在R中处理时间戳的有限经验是使用POSIXct).通常情况下,使用read.table将其拉入,我会使用:
df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")
Run Code Online (Sandbox Code Playgroud)
但是,第二列似乎失去了它的前导零(可能通过类型强制?),因此它无法正常工作.
我看合并日期整数和时间因素POSIXct中的R和转换日期和时间数据的两列一个,但两者都使用时间带分隔符,如:,所以不要有同样的问题.
如何将这些列转换为POSIXct,好吗?