簡體   English   中英

從未格式化的日期字符向量中提取年份

[英]Extracting year from unformatted date character vector

我有一個字符向量,它以無格式的日期表示覆蓋的年份,如下所示:

     Period of coverage
1    1/1/2011 to 31/12/2011
2    1/1/2010 to 31/12/2010
3    1/1/2012 to 31/12/2012
4    1/1/2010 to 31/12/2010
5    1/1/2011 to 31/12/2011
6    1/1/2012 to 31/12/2012
7    1/1/2010 to 31/12/2010
8    1/1/2010 to 31/12/2010
9    1/1/2009 to 31/12/2009

我想知道如何將這些列轉換成每個觀測值代表的年份。 每行都有相同的開始日期和結束日期(1/1和31/12)。

假設您的數據存儲在可變period並且所有日期的格式都保持不變,如您所說,

yr = substr(period, 19, 22)

假設DF在末尾的注釋中可重復顯示,請刪除所有內容,直到最后一個斜杠並轉換為數字:

transform(DF, year = as.numeric(sub(".*/", "", `Period of coverage`)), check.names = FALSE)

贈送:

      Period of coverage year
1 1/1/2011 to 31/12/2011 2011
2 1/1/2010 to 31/12/2010 2010
3 1/1/2012 to 31/12/2012 2012
4 1/1/2010 to 31/12/2010 2010
5 1/1/2011 to 31/12/2011 2011
6 1/1/2012 to 31/12/2012 2012
7 1/1/2010 to 31/12/2010 2010
8 1/1/2010 to 31/12/2010 2010
9 1/1/2009 to 31/12/2009 2009

另一種可能性是首先將其轉換為Date類,注意as.Date忽略垃圾:

to_year <- function(x, fmt) as.numeric(format(as.Date(x, fmt), "%Y"))
transform(DF, year = to_year(`Period of coverage`, "%d/%m/%Y"), check.names = FALSE)

注意

Lines <- "     Period of coverage
1/1/2011 to 31/12/2011
1/1/2010 to 31/12/2010
1/1/2012 to 31/12/2012
1/1/2010 to 31/12/2010
1/1/2011 to 31/12/2011
1/1/2012 to 31/12/2012
1/1/2010 to 31/12/2010
1/1/2010 to 31/12/2010
1/1/2009 to 31/12/2009"
DF <- read.csv(text = Lines, check.names = FALSE, as.is = TRUE)

如果您的字符串始終具有相同的格式,則只需使用子字符串並將其轉換為日期即可:

    as.Date(substr("1/1/2011 to 31/12/2011",5,8), format="%Y") 
as.Date(substr("1/1/2011 to 31/12/2011",19,23), format="%Y")

如果字符串的可變性更大,但始終用“ to”分隔,則可以使用stringsplit取消列出字符串,然后將其格式化為年份:

a <- "1/1/2011 to 31/12/2011"
a2 <- strsplit(a, "to") ;
a3 <- unlist(a2) ;
a4 <- as.Date(a3, format="%d/%m/%Y")
year = format(a4, format="%Y")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM