我想去秃头试图解决这个问题。我试图根据位置从不同长度的字符串中提取字符。例如,假设我有一个包含8行和1列的数据框,标题为:" Time"
该列在每行中具有以下值:
TIME
5
20
100
105
150
1050
2005
2010
我试图找出如何根据位置提取这些字符串中的字符并采用以下格式。如果你看,你可以看到最后两个字符放在 00:here:00 ,而所有其他字符都放在这里:00:00 。结果应该是:
5 - > 00:05:00(如果只有1个字符)
20 - > 00:20:00(如果有2个字符)
100 - > 1:00:00(如果有3个字符)
105 - > 1:05:00(如果有3个字符)
150 - > 1:50:00(如果有3个字符)
1050 - > 10:50:00(如果有4个字符)
2005年 - > 20:05:00(如果有4个字符)
2010 - > 20:10:00(如果有4个字符)
基本上伪代码就是这样的 从dataframe $ column1中提取最后两个字符并将其放在 00:here:00 - 所有剩余的字符应该这里:00:00
答案 0 :(得分:3)
format( as.POSIXct(sprintf("%04.0f", TIME), format="%H%M"), format="%H:%M:%S")
[1] "00:05:00" "00:20:00" "01:00:00" "01:05:00"
[5] "01:50:00" "10:50:00" "20:05:00" "20:10:00"
sprintf
将时间变量的字符值填充为前导0' s。 as.POSIXct
将当前日期作为该时间读入,然后外部format.POSIXt
函数会删除日期字符。
答案 1 :(得分:2)
这种做法怎么样?
time <- readLines(n = 8)
5
20
100
105
150
1050
2005
2010
sub("(\\d{2})(\\d{2})", "\\1:\\2:00", sprintf("%04d", as.numeric(time)))
# [1] "00:05:00" "00:20:00" "01:00:00" "01:05:00" "01:50:00" "10:50:00" "20:05:00" "20:10:00"
答案 2 :(得分:1)
这个怎么样:
library(stringr)
TIME <- c('5','20','100','105','150','1050','2005','2010')
TIMEpadded <- paste0(str_pad(TIME, width=4, pad=0), '00')
sub('(.+)(.{2})(.{2})', '\\1:\\2:\\3', TIMEpadded)
## [1] "00:05:00" "00:20:00" "01:00:00" "01:05:00" "01:50:00" "10:50:00" "20:05:00" "20:10:00"
答案 3 :(得分:0)
public static String transform (String in)
{
while (in.length() < 4)
{
in = "0" + in;
}
in = in.substring(0,2) + ":" + in.substring(2,4) + ":00";
return(in);
}
public static void main (String[] args)
{
for (String s : new String[]{"5", "20", "100", "105", "150", "1050", "2005", "2010"})
{
System.out.println(s + " -> " + transform(s));
}
}
方法转换: 1)将零添加到字符串中的时间值,直到获得4位数字符串。 2)在字符串中插入“:”,每两个字符和一个尾随“00”。
方法main运行您提供的示例, 输出如下:
5 -> 00:05:00
20 -> 00:20:00
100 -> 01:00:00
105 -> 01:05:00
150 -> 01:50:00
1050 -> 10:50:00
2005 -> 20:05:00
2010 -> 20:10:00