sourcetip

연도 및 월("yyyy-mm" 형식)을 날짜로 변환하시겠습니까?

fileupload 2023. 6. 7. 23:04
반응형

연도 및 월("yyyy-mm" 형식)을 날짜로 변환하시겠습니까?

다음과 같은 데이터 세트가 있습니다.

Month    count
2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386

데이터(월은 x 값이고 카운트는 y 값)를 표시하려고 합니다.데이터에 공백이 있기 때문에 해당 달 정보를 날짜로 변환하고 싶습니다.노력했습니다.

as.Date("2009-03", "%Y-%m")

하지만 그것은 효과가 없었습니다.왜 그래요?는 것 같습니다.as.Date()또한 하루가 필요한데 하루의 표준 값을 설정할 수 없습니까?문제를 해결하는 기능은 무엇입니까?

날짜는 숫자 값과 시작 날짜에 해당하므로 실제로 날짜가 필요합니다.데이터를 날짜 형식으로 지정해야 하는 경우 다음 날짜에 붙여 수동으로 날짜를 매월 1일로 수정할 수 있습니다.

month <- "2009-03"
as.Date(paste(month, "-01", sep=""))

이거 먹어봐요.(여기서 사용)text=Lines예제 자체를 포함하도록 유지하지만 실제로는 파일 이름으로 대체할 것입니다.

Lines <- "2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386"

library(zoo)
z <- read.zoo(text = Lines, FUN = as.yearmon)
plot(z)

은 이 가 더 이 데 그 가 예 리 쁘 않 데더 가 터 있 있 X수 코 사 다 니 습 도 용 를 드 할 고 축 X표 에 섹 예 의 급 된 시 에 션 수 은 제 괜 많 이 터 고 도 지 면 는 찮 으 이 실 지 을 만 제 로 ▁for ▁section ▁code ▁of ▁the ▁x ▁axis?plot.zoo.

시리즈, 동원리즈시물,,즈,z은 위에생된것은이 ."yearmon"다음과 같이 표시됩니다.

> z
Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 
      12      310     2379      234       14        1       34     2386 

"yearmon"단독으로도 사용할 수 있습니다.

> as.yearmon("2000-03")
[1] "Mar 2000"

참고:

  1. "yearmon"클래스 오브젝트는 일정관리 순서로 정렬됩니다.

  2. 수각의 일 하지 않은 의합니다. 그러나 각 월의 일 수에 비례하여 간격이 일정하지 않은 간격으로 포인트를 표시하는 것이 필요한 경우, 다음의 인덱스를 변환합니다.z"Date" 클스래:time(z) <- as.Date(time(z)).

날짜 형식이 필요한 경우 가장 간단한 해결 방법:

library(zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"

as.Date매월 첫째 날을 yearmon 개체로 고정합니다.

또한 다음을 통해 이를 달성할 수 있습니다.parse_date_time또는fast_strptimelubridatepackage:

> parse_date_time(dates1, "ym")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

> fast_strptime(dates1, "%Y-%m")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

그 둘의 차이점은parse_date_time윤활유 스타일 형식 지정을 허용하는 반면fast_strptime에는 와동한형사필요니다합양과 동일한 합니다.strptime.

는 표시간를지다사수있다습니용할음을을 할 수 .tzparameter는 다음과 같습니다.

> parse_date_time(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"

데이터에 이 있을 는 "-" - " 시에이불성있규경는수사다습있용짜를 할 수 .truncated는 몇 -parameter는 다음과 같습니다.

> parse_date_time(dates2, "ymdHMS", truncated = 3)
[1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC"

사용된 데이터:

dates1 <- c("2009-01","2009-02","2009-03")
dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01")

언제든지 패키지 사용:

library(anytime)

anydate("2009-01")
# [1] "2009-01-01"

실제로 위에서 언급한 바와 같이 (SO의 다른 곳에서도) 문자열을 날짜로 변환하려면 특정 월 날짜가 필요합니다.as.Date()수동 페이지:

날짜 문자열이 날짜를 완전히 지정하지 않은 경우 반환되는 응답은 시스템별일 수 있습니다.가장 일반적인 동작은 누락된 연도, 월 또는 일을 현재의 것으로 가정하는 것입니다.날짜를 잘못 지정하면 신뢰할 수 있는 구현에서 오류가 발생하고 날짜가 NA로 보고됩니다.도 몇 구현(예: 안깝게몇예일구현인적반가지도타예()은 다음과 같습니다.glibc할 수 의미를 합니다.)는 신뢰할 수 없으며 의도된 의미를 추측합니다.

를 붙여넣는 것입니다."01" 각날짜및사지까용을 합니다.strptime()그것을 그 달의 첫날로 표시하기 위해.


R: 처리 날짜 및 시간에 대한 배경 정보를 좀 더 알고자 하는 사용자:

은 R 서 시사용을 합니다.POSIXct그리고.POSIXlt클래스 및 날짜는 다음을 사용합니다.Date학생들

날짜는 1970년 1월 1일 이후의 일 수로 저장되고 시간은 1970년 1월 1일 이후의 초 수로 저장됩니다.

예를 들어, 다음과 같습니다.

d <- as.Date("1971-01-01")
unclass(d)  # one year after 1970-01-01
# [1] 365

pct <- Sys.time()  # in POSIXct
unclass(pct)  # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt)  # up is now a list containing the components of time
names(up)
# [1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"   "isdst"  "zone"  
# [11] "gmtoff"
up$hour
# [1] 9

날짜 및 시간에 대한 작업 수행하기

plt - as.POSIXlt(d)
# Time difference of 16420.61 days

날짜를 처리하려면 다음을 사용할 수 있습니다.strptime()(매뉴얼 페이지에서 다음 예를 참조하십시오.)

strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"

# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"

저는 @ben-rollert의 솔루션이 좋은 해결책이라고 생각합니다.

이 솔루션을 새 패키지 내의 기능에 사용하려면 주의해야 합니다.

패키지를 개발할 때는 구문을 사용하는 것이 좋습니다.packagename::function_name()(http://kbroman.org/pkg_primer/pages/depends.html) 참조).

▁▁version합▁the다니▁in▁use의 버전을 사용해야 합니다.as.Date()에의정된으로 zoo도서관.

다음은 예입니다.

> devtools::session_info()
Session info ----------------------------------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.1 (2016-06-21)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.35)            
 language (EN)                        
 collate  C                           
 tz       <NA>                        
 date     2016-11-09                  

Packages --------------------------------------------------------------------------------------------------------------------------------------------------------

 package  * version date       source        
 devtools   1.12.0  2016-06-24 CRAN (R 3.3.1)
 digest     0.6.10  2016-08-02 CRAN (R 3.2.3)
 memoise    1.0.0   2016-01-29 CRAN (R 3.2.3)
 withr      1.0.2   2016-06-20 CRAN (R 3.2.3)

> as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) 
Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : 
  do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date”

> zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
[1] "1989-10-01"

따라서 패키지를 개발하는 경우 다음을 사용하는 것이 좋습니다.

zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))

tidyverse최근에 패키지를 추가했습니다.lubridate이를 위한 몇 가지 기능이 있습니다.

library(clock)

x <- year_month_day_parse(df$Month, format = "%Y-%m", precision = "month") 
# <year_month_day<month>[8]>
# [1] "2009-01" "2009-02" "2009-03" "2009-04" "2009-05" "2009-08" "2009-09" "2009-10"

날짜 조작 및 추출

이 출력은 연도-월-일 벡터로, 날짜 산술을 계속 수행하고 다른 일반 함수를 예상대로 적용할 수 있습니다.

sort(x, decreasing = T)
# <year_month_day<month>[8]>
# [1] "2009-10" "2009-09" "2009-08" "2009-05" "2009-04" "2009-03" "2009-02" "2009-01"

add_months(x, 3)
# <year_month_day<month>[8]>
# [1] "2009-04" "2009-05" "2009-06" "2009-07" "2009-08" "2009-11" "2009-12" "2010-01"

add_years(x, -2)
# <year_month_day<month>[8]>
# [1] "2007-01" "2007-02" "2007-03" "2007-04" "2007-05" "2007-08" "2007-09" "2007-10"

get_month(x)
# [1]  1  2  3  4  5  8  9 10

경우 날짜를 설정할 수도 .set_day:

set_day(x, 1)
<year_month_day<day>[8]>
[1] "2009-01-01" "2009-02-01" "2009-03-01" "2009-04-01" "2009-05-01" "2009-08-01"
[7] "2009-09-01" "2009-10-01"

잘못된 날짜 처리

이 얻고자 , ,▁the▁or했면다,▁with▁the▁month▁of얻▁you,invalid_*일련의 기능은 다음과 같은 이점을 제공합니다.

# not 31 days in Feb, Apr, Sep
y <- set_day(x, 31)
# <year_month_day<day>[8]>
# [1] "2009-01-31" "2009-02-31" "2009-03-31" "2009-04-31" "2009-05-31" "2009-08-31"
# [7] "2009-09-31" "2009-10-31"

invalid_any(y)
[1] TRUE

invalid_detect(y)
[1] FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE

하지 않은 날짜는 못된날 수있습으로 할 수 .invalid_resolve을 는또드사수있습다니할용과 함께 할 수 .invalid_remove:

invalid_resolve(y, invalid = "previous")
<year_month_day<day>[8]>
[1] "2009-01-31" "2009-02-28" "2009-03-31" "2009-04-30" "2009-05-31" "2009-08-31"
[7] "2009-09-30" "2009-10-31"

값을 지정할 수 있습니다.invalid잘못된 날짜를 처리하기 위한 인수:

"이전":이전의 유효한 시간 인스턴스입니다.

"전일":하루 중 시간을 유지하는 시간으로 유효한 전날입니다.

"next": 유효한 다음 순간입니다.

"다음 날":시간이 지정된 다음 유효한 날짜로, 시간을 유지합니다.

"수정":입력이 유효하지 않은 일 수만큼 오버플로가 발생합니다.시간이 삭제됩니다.

"예약일":입력이 유효하지 않은 일 수만큼 오버플로가 발생합니다.시간이 유지됩니다.

"NA": 잘못된 날짜를 NA로 대체합니다.

"error": 잘못된 날짜에 오류가 발생했습니다.

사용방을 사용하는 ymlubridate.

월은 숫자, 약어 월 또는 다양한 구분 기호(예: 구분 기호가 없는 경우에도)가 있는 전체 월 이름일 수 있습니다.

library(lubridate)

ym(c("2012/September", "2012-Aug", "2012.07", 201204))
[1] "2012-09-01" "2012-08-01" "2012-07-01" "2012-04-01"

주어진 데이터에서:

ym(dat$Month)
[1] "2009-01-01" "2009-02-01" "2009-03-01" "2009-04-01" "2009-05-01"
[6] "2009-08-01" "2009-09-01" "2009-10-01"

참고로 다음과 같은 기능도 있습니다.my만약 당신이 그것을 반대로 가지고 있다면, 예를 들어.Sep/2022.

데이터.

dat <- structure(list(Month = c("2009-01", "2009-02", "2009-03", "2009-04",
"2009-05", "2009-08", "2009-09", "2009-10"), count = c(12L, 310L,
2379L, 234L, 14L, 1L, 34L, 2386L)), class = "data.frame", row.names = c(NA,
-8L))

언급URL : https://stackoverflow.com/questions/6242955/converting-year-and-month-yyyy-mm-format-to-a-date

반응형