标签: posixct

R中的字符POSIXct转换在夏令时转换(CEST/CET)时导致错误的时区值

我在将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)

r posixct

17
推荐指数
1
解决办法
6401
查看次数

如何在保持其R类的同时从POSIXlt时间加/减时间?

我正在操作一些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,但有没有更优雅和有效的方法来实现这一目标?

time r date posixct

16
推荐指数
4
解决办法
4万
查看次数

在data.table中有效比较POSIXct

您好我正在寻找一种有效的方法来选择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)

r time-series subset posixct data.table

16
推荐指数
1
解决办法
3703
查看次数

子集观察至少相差30分钟

我有一个data.table(约3000万行)由一datetimePOSIXct格式,一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)

r posixct data.table

16
推荐指数
3
解决办法
318
查看次数

减去POSIXct时如何在相同单位中产生时差

我想减去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)

datetime r posixct

15
推荐指数
1
解决办法
2万
查看次数

在R中将因子转换为日期/时间

这是我的数据框中包含的信息:

## 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的关系,但它不会让我在指定的时间段内绘制我想要的因素.我不知道接下来该尝试什么...

r date posixct posixlt r-factor

14
推荐指数
2
解决办法
7万
查看次数

POSIXct类中的毫秒数

如何正确解析毫秒?

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.

r posixct

13
推荐指数
1
解决办法
8529
查看次数

计算一天中每小时发生的持续时间的一部分

我有一个带有开始和结束时间的数据框:

  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)

datetime r posixct lubridate

13
推荐指数
1
解决办法
604
查看次数

将200万行日期字符串加速转换为POSIX.ct

我有一个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而不是其他一些方法,比如设置数据库.话虽如此,我愿意通过任何方法来实现这一目标,以实现最快的转换.

我非常感谢任何帮助.提前致谢.

posix r time-series posixct xts

12
推荐指数
1
解决办法
2075
查看次数

R - 使用HHMMSS格式将日期和时间字段转换为POSIXct

我有一个数据文件,其中有三列:

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,好吗?

datetime r posixct

12
推荐指数
1
解决办法
4万
查看次数

标签 统计

posixct ×10

r ×10

datetime ×3

data.table ×2

date ×2

time-series ×2

lubridate ×1

posix ×1

posixlt ×1

r-factor ×1

subset ×1

time ×1

xts ×1