R 如何从大整数中提取日、月、年、小时和分钟

R 如何从大整数中提取日、月、年、小时和分钟,r,datetime,R,Datetime,在我的原始数据文件(4600条记录)中,日期、年份、小时和分钟合并为一个大整数,例如: 1205981254(1998年5月12日12时54分) 问题在于,每个月的第10天到第31天之间的日期记录有10位数字,而第1天到第9天之间的日期只有9位数字: 905981254(1998年5月9日12时54分) 我在很多年前还是一名学生的时候创建了这个原始数据文件,并且没有遵循任何特定的格式。如何从这些整数中提取日、月、年和时间?我已经阅读了所有以前的Qs和As,但没有找到解决我特定问题的方法。如果您所

在我的原始数据文件(4600条记录)中,日期、年份、小时和分钟合并为一个大整数,例如:

1205981254(1998年5月12日12时54分)

问题在于,每个月的第10天到第31天之间的日期记录有10位数字,而第1天到第9天之间的日期只有9位数字:

905981254(1998年5月9日12时54分)


我在很多年前还是一名学生的时候创建了这个原始数据文件,并且没有遵循任何特定的格式。如何从这些整数中提取日、月、年和时间?我已经阅读了所有以前的Qs和As,但没有找到解决我特定问题的方法。

如果您所有的年份都是
19XX
而不是
20XX
,您可以使用

dates <- c(1205981254,905981254)
as.POSIXct(sub("(..)(..)(..)(..)$","-\\1-19\\2 \\3:\\4", dates),format="%d-%m-%Y %H:%M")

 "1998-05-12 12:54:00 AST" "1998-05-09 12:54:00 AST"

日期如果一年中的世纪保持不变,这可能对你有用

库(dplyr)
#> 
#>武官帕克特:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#> 
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#> 
#>相交、setdiff、setequal、并集
x唱片
#> 1 1998-05-09 12:54:00
#> 2 1998-05-12 12:54:00
#> 3 1998-05-09 12:54:00
#> 4 1998-05-12 12:54:00
#> 5 1998-05-09 12:54:00
#> 6 1998-05-12 12:54:00

由(v0.3.0)于2020-07-07创建,您可以将数据转换回
POSIXct
/
POSIXlt
格式:

x <- c(1205981254, 905981254)
x1 <- as.POSIXct(sprintf("%010d", x), format = "%d%m%y%H%M", tz = 'UTC')
x1
#[1] "1998-05-12 12:54:00 UTC" "1998-05-09 12:54:00 UTC"
您可以尝试以下方法:

v1 <- '1205981254'
v2 <- '905981254'
#Extract dates first
nv1 <- as.Date(v1,'%d%m%y%H%M')
nv2 <- as.Date(paste0(0,v2),'%d%m%y%H%M')
#Extract hours
nh1 <- paste0(substr(v1,nchar(v1)-3,nchar(v1)-2),':',substr(v1,nchar(v1)-1,nchar(v1)),':00')
nh2 <- paste0(substr(v2,nchar(v2)-3,nchar(v2)-2),':',substr(v2,nchar(v2)-1,nchar(v2)),':00')
#Concatenate
ndate1 <- paste0(nv1,' ',nh1)
ndate2 <- paste0(nv2,' ',nh2)
#Define as dates
as.POSIXlt(ndate1,tz = 'GMT')
as.POSIXlt(ndate2,tz = 'GMT')

[1] "1998-05-12 12:54:00 GMT"
[1] "1998-05-09 12:54:00 GMT"

v1
日期在您的编码方案中,日期2001年1月1日和2007年1月1日的值是多少?您所有的日期都是19xx吗?或者,您是跨入20xx吗?所有日期都是从19xx开始的,1999年1月1日,2007年1月1日将是101990107请尝试使用另一个示例
905981254
。错误消息:>测试。在我的回答中,$x1@Dag先生似乎使用
x
。试试
str_pad
x1它能工作。时区UTC+2的synthax性能如何?tz='UTC+2'不起作用。您可能可以使用
Etc/GMT-2
。在控制台中运行
OlsonNames()
,以获取可使用的有效时区列表。
v1 <- '1205981254'
v2 <- '905981254'
#Extract dates first
nv1 <- as.Date(v1,'%d%m%y%H%M')
nv2 <- as.Date(paste0(0,v2),'%d%m%y%H%M')
#Extract hours
nh1 <- paste0(substr(v1,nchar(v1)-3,nchar(v1)-2),':',substr(v1,nchar(v1)-1,nchar(v1)),':00')
nh2 <- paste0(substr(v2,nchar(v2)-3,nchar(v2)-2),':',substr(v2,nchar(v2)-1,nchar(v2)),':00')
#Concatenate
ndate1 <- paste0(nv1,' ',nh1)
ndate2 <- paste0(nv2,' ',nh2)
#Define as dates
as.POSIXlt(ndate1,tz = 'GMT')
as.POSIXlt(ndate2,tz = 'GMT')

[1] "1998-05-12 12:54:00 GMT"
[1] "1998-05-09 12:54:00 GMT"
dates <- c( 1205981254, 905981254 )
#convert to character
dates <- as.character( dates )
#convert to posix, based on length.. add a 0 as prefix in case of 9 character-length
dplyr::if_else( nchar(dates) == 10, 
                as.POSIXct( dates, format = "%d%m%y%H%M"),
                as.POSIXct( paste0(0,dates), format = "%d%m%y%H%M") )

[1] "1998-05-12 12:54:00 CEST" "1998-05-09 12:54:00 CEST"