我很感兴趣,“ct”和“lt”(在 POSIXct 和 POSIXlt 中)是什么意思。它们是某种缩写吗?例如,“ct”是否表示“日历时间”和“lt”其他意思?
我有一个可能是一个非常简单的问题.我想从数据帧处理一列POSIXct对象并生成一个datetime字符串向量.我尝试使用以下sapply调用
dt <- sapply(df$datetime, function(x) format(x,"%Y-%m-%dT%H:%M:%S"))
Run Code Online (Sandbox Code Playgroud)
但无济于事.我一直收到以下错误:
> Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, :
invalid 'trim' argument
Run Code Online (Sandbox Code Playgroud)
当我将此函数应用于列中的单个POSIXct对象时,我没有问题.关于问题是什么,我现在很难过.我是否需要对POSIXct对象做一些特别的事情?
我有一列持续时间存储为数据帧中的字符串.我想将它们转换为适当的时间对象,可能是POSIXlt.使用此方法很容易解析大多数字符串:
> data <- data.frame(time.string = c(
+ "1 d 2 h 3 m 4 s",
+ "10 d 20 h 30 m 40 s",
+ "--"))
> data$time.span <- strptime(data$time.string, "%j d %H h %M m %S s")
> data$time.span
[1] "2012-01-01 02:03:04" "2012-01-10 20:30:40" NA
Run Code Online (Sandbox Code Playgroud)
缺少的持续时间被编码"--"并需要转换为NA- 这已经发生但应该保留.
挑战在于字符串会丢弃零值元素.因此,期望的值2012-01-01 02:00:14将是字符串"1 d 2 h 14 s".但是这个字符串NA用简单的解析器解析:
> data2 <- data.frame(time.string = c(
+ …Run Code Online (Sandbox Code Playgroud) 我在R中使用ROracle访问Oracle数据库。
我注意到,大概是从夏季更改以来,任何DATE(日期时间)Oracle列现在都被错误地转换了(R中的小时数比Oracle DB中的小时数少)。
从小插图的第12页(我几乎不了解),它看起来像ROracle和R交换日期时间为自UTC 1970年1月1日以来的秒数,并且R随后针对本地时区进行了调整。
这是我的工作
drv <- dbDriver("Oracle");
con <- dbConnect(drv, username = Login, password = Pwd, dbname = DB, prefetch=TRUE, bulk_read=1e6);
test.query <- "SELECT * FROM MYTABLE WHERE ( A > to_date('2008-03-03 12:30:00', 'YYYY-MM-DD HH24:MI:SS') AND A < to_date('2008-03-03 12:40:00','YYYY-MM-DD HH24:MI:SS') AND [other stuff])"
test <- dbGetQuery(con, test.query);
head(test[,c("A","B","C")])
# A B C
#1 2008-03-03 11:30:38 2008-03-02 23:00:00 2008-03-02 23:00:00 #HERE IT SHOULD BE +1 HOUR
#2 2008-03-03 11:30:38 2008-03-02 …Run Code Online (Sandbox Code Playgroud) 我正在尝试从PostgreSQL数据库中提取数据,并且时间戳字段的结果不一致.我不确定我是否正确处理POSIXct结果.否则,我想我在RPostgreSQL包中发现了一个错误.以下是复制问题的方法:
假设postgres数据库中有一个表有一个字段(在PostgreSQL中运行):
CREATE DATABASE mydb;
CREATE TABLE test_table
(
"DateTime" timestamp without time zone NOT NULL,
CONSTRAINT "pk_test_table" PRIMARY KEY ("DateTime")
)
WITH (
OIDS=FALSE
);
ALTER TABLE test_table
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
让我们说有几百条记录.我将在R中填充它们.这是代码:
library(RPostgreSQL)
# Let's feed the table with some sequence of date/time values
date_values <- as.chron(seq(10000, 10500, 1/24))
format.chron <- function(z) {
sprintf("%04.0f-%02.0f-%02.0f %02.0f:%02.0f:00",
as.numeric(as.character(years(z))),
months(z),
as.numeric(as.character(days(z))),
as.numeric(as.character(hours(z))),
as.numeric(as.character(minutes(z))))
}
.generateInsertQuery <- function(date_values, field_name, table_name) {
insert_val <- paste(paste0("(", sQuote(format(date_values)), ")"), collapse=',')
qry <- paste("INSERT INTO", dQuote(table_name), paste0("(", …Run Code Online (Sandbox Code Playgroud) 我不确定我可以在这里提出这个问题,让我知道我是否应该在其他地方这样做.
我有一个data.table,其中包含1e6行,具有以下结构:
V1 V2 V3
1: 03/09/2011 08:05:40 1145.0
2: 03/09/2011 08:06:01 1207.3
3: 03/09/2011 08:06:17 1198.8
4: 03/09/2011 08:06:20 1158.4
5: 03/09/2011 08:06:40 1112.2
6: 03/09/2011 08:06:59 1199.3
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码将V1和V2变量转换为唯一的datetime变量:
system.time(DT[,`:=`(index= as.POSIXct(paste(V1,V2),
format='%d/%m/%Y %H:%M:%S'),
V1=NULL,V2=NULL)])
user system elapsed
47.47 0.16 50.27
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以改善这种转变的表现?
这里dput(head(DT)):
DT <- structure(list(V1 = c("03/09/2011", "03/09/2011", "03/09/2011",
"03/09/2011", "03/09/2011", "03/09/2011"), V2 = c("08:05:40",
"08:06:01", "08:06:17", "08:06:20", "08:06:40", "08:06:59"),
V3 = c(1145, 1207.3, 1198.8, 1158.4, 1112.2, 1199.3)), .Names = c("V1",
"V2", "V3"), class = c("data.table", "data.frame"), …Run Code Online (Sandbox Code Playgroud) 将数据帧融合到整个范围会更改"时间"(类POSIXct)列的打印方式.
t.wide <- data.frame(product=letters[1:5],
result=c(2, 4, 0, 0, 1),
t1=as.POSIXct("2014-05-26") + seq(0, 10800, length.out=5),
t2=as.POSIXct("2014-05-27") + seq(0, 10800, length.out=5),
t3=as.POSIXct("2014-05-28") + seq(0, 10800, length.out=5))
library(reshape2)
t.long <- melt(t.wide, measure.vars=c("t1", "t2", "t3"), value.name="time")
t.long$time
[1] 1401055200 1401057900 1401060600 1401063300 1401066000 1401141600 1401144300
[8] 1401147000 1401149700 1401152400 1401228000 1401230700 1401233400 1401236100
[15] 1401238800
attr(,"class")
[1] "POSIXct" "POSIXt"
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果print()显式调用,则按预期打印对象(时间戳,而不是它们的数字表示).
print(t.long$time)
[1] "2014-05-26 00:00:00 CEST" "2014-05-26 00:45:00 CEST" "2014-05-26 01:30:00 CEST"
[4] "2014-05-26 02:15:00 CEST" "2014-05-26 03:00:00 CEST" "2014-05-27 00:00:00 CEST"
[7] …Run Code Online (Sandbox Code Playgroud) 我以日期形式提供数据(格式"YYYY-MM-DD",例如"2015-03-11",以及当天的小时数(0-23).
生成表单的时间对象最方便的方法是什么
"2015-03-11" and hour = 0 -> "2015-03-11 00:00"
"2015-03-11" and hour = 1 -> "2015-03-11 01:00"
"2015-03-11" and hour = 2 -> "2015-03-11 02:00"
Run Code Online (Sandbox Code Playgroud)
我可以使用Base中的Date函数或来自xts或timeDate的函数.应该很容易,但我相信那里的人很快就会知道.
编辑:数据以2列提供,一列用于日期,一列用数字.
我有一个像"2016-01-01"(YYYY-MM-DD)的日期,我正在as.numeric(as.POSIXct(...))使用它作为整数.
我的问题是,有没有办法在一年,一个月或一天中添加到这个日期?我的意思是,如果我在2016年增加一年,它将与2015年增加一年(bissextile stuff)相同.
与在1月1日添加32天相同,与在2月01日添加32天相同(因为可能更改的天数)
我设法把东西了年和月的作品,但我想实现天以及
how_long_is_simul <- function(lst){
# Format DATE_START
greg_date = intDate_to_gregorianDate(DATE_START)
reg = "^([0-9]{4})\\-([0-9]{2})\\-([0-9]{2})$" # black-magic
splited_date = str_match(greg_date, reg)
# Manage months limit
lst$years = lst$years + floor(lst$months/12)
lst$months = lst$months%%12
# Build new date
my_vector = c(lst$years, lst$months, 0)
end_date = paste(as.numeric(splited_date[2:4]) + my_vector, collapse = "-")
return(round((gregorianDate_to_intDate(end_date)-DATE_START)/86400))
}
# AND the vars used by the function
DATE_START <- 1451606400 # 2016-01-01 GMT
lst = list( # no days, …Run Code Online (Sandbox Code Playgroud) 我有两列PosixLT时间没有NA值,但NA值会在检查时显示
> sum(is.na(check$start))
[1] 19
> sum(is.na(check$end))
[1] 23
Run Code Online (Sandbox Code Playgroud)
数据存在于单元格中,为什么会发生这种情况呢?我听说PosixLT会发生这种情况,但即使我将其转换为posixCT,也会有非常奇怪的行为.如何解决这个问题呢?
> as.POSIXct(check$start, format = "%Y-%m-%d %H:%M:%S", tz = "CST6CDT")
[1] NA "2014-03-09 01:35:01 CST" NA "2014-03-09 01:53:30 CST" NA
[6] NA NA NA NA "2014-03-09 04:17:11 CDT"
[11] NA NA "2015-03-08 01:54:43 CST" NA NA
[16] NA NA NA NA NA
[21] NA NA NA
> dput(check)
structure(list(start = structure(list(sec = c(24, 1, 27, 30,
8, 21, 40, 9, 43, 11, 31, 43, 43, 55, 39, 54, 41, 19, 2, …Run Code Online (Sandbox Code Playgroud) posixct ×10
r ×9
datetime ×2
data.table ×1
date ×1
oracle ×1
performance ×1
posixlt ×1
reshape2 ×1
rpostgresql ×1
sapply ×1
string ×1
time ×1
timezone ×1