데이터 프레임의 타임 스탬프 행에서 구간을 분할하고 집계하는 효율적인 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2441136

  •  19-09-2019
  •  | 
  •  

문제

타임 스탬프 행이있는 데이터 프레임 (strptime results)에서 간격에 대한 통계를 집계하는 가장 좋은 방법은 무엇입니까?

간격은 한 시간, 하루 등이 될 수 있습니다.

거기 있습니다 aggregate 함수이지만 각 행을 간격으로 할당하는 데 도움이되지 않습니다. 간격을 나타내는 데이터 프레임에 열을 추가 할 계획입니다. aggregate, 그러나 더 나은 솔루션이 있다면 듣는 것이 좋을 것입니다.

포인터에 감사드립니다!


예제 데이터

타임 스탬프가있는 5 줄은 03:00에 시작하는 15 분 간격으로 나뉩니다.

간격 1

  • "2010-01-13 03:02:38 UTC"
  • "2010-01-13 03:08:14 UTC"
  • "2010-01-13 03:14:52 UTC"

간격 2

  • "2010-01-13 03:20:42 UTC"
  • "2010-01-13 03:22:19 UTC"

결론

다음과 같은 시계열 패키지 사용 xts 해결책이어야합니다. 그러나 나는 그들을 사용하여 성공하지 못했고 cut. 현재 구간으로 그룹을 그룹화하여 히스토그램을 플로팅하면 충분했습니다. 이것은 충분했습니다.

cut 좋아요 :

interv <- function(x, start, period, num.intervals) {
  return(cut(x, as.POSIXlt(start)+0:num.intervals*period))
}
도움이 되었습니까?

해결책

분할 벡터에 대한 표준 기능은 다음과 같습니다 cut 그리고 findInterval:

v <- as.POSIXct(c(
  "2010-01-13 03:02:38 UTC",
  "2010-01-13 03:08:14 UTC",
  "2010-01-13 03:14:52 UTC",
  "2010-01-13 03:20:42 UTC",
  "2010-01-13 03:22:19 UTC"
))

# Your function return list:
interv(v, as.POSIXlt("2010-01-13 03:00:00 UTC"), 900)
# [[1]]
# [1] "2010-01-13 03:00:00"
# [[2]]
# [1] "2010-01-13 03:00:00"
# [[3]]
# [1] "2010-01-13 03:00:00"
# [[4]]
# [1] "2010-01-13 03:15:00 CET"
# [[5]]
# [1] "2010-01-13 03:15:00 CET"

# cut returns factor, you must provide proper breaks:
cut(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 2010-01-13 03:00:00 2010-01-13 03:00:00 2010-01-13 03:00:00
# [4] 2010-01-13 03:15:00 2010-01-13 03:15:00
# Levels: 2010-01-13 03:00:00 2010-01-13 03:15:00

# findInterval returns vector of interval id (breaks like in cut)
findInterval(v, as.POSIXlt("2010-01-13 03:00:00 UTC")+0:2*900)
# [1] 1 1 1 2 2

기록을 위해 : cut 방법이 있습니다 POSIXt 유형이지만 불행히도 제공 할 방법이 없습니다. start 인수, 효과는 다음과 같습니다.

cut(v,"15 min")
# [1] 2010-01-13 03:02:00 2010-01-13 03:02:00 2010-01-13 03:02:00
# [4] 2010-01-13 03:17:00 2010-01-13 03:17:00
# Levels: 2010-01-13 03:02:00 2010-01-13 03:17:00

보시다시피 03:02:00에 시작됩니다. 출력 계수의 레이블을 엉망으로 만들 수 있습니다 (레이블을 시간으로 변환하고 어떻게 든 라운을 돌리며 다시 문자로 변환).

다른 팁

a 시계열 패키지. XTS 패키지에는이를 위해 특별히 설계된 기능이 있습니다. 또는 동물원 패키지의 집계 및 롤 apply 기능을 살펴보십시오.

RMetrics eBook에는 다양한 패키지의 성능 비교를 포함하여 유용한 토론이 있습니다. https://www.rmetrics.org/files/freepdf/timeseriesfaq.pdf

편집하다: 보다 이 질문에 대한 나의 대답. 기본적으로 모든 타임 스탬프를 특정 간격으로 잘라내어 새로운 잘린 타임 스탬프를 그룹화 벡터로 사용하여 집계를 수행해야합니다.

이것은 흥미로운 질문입니다. 다양한 시계열 패키지 및 방법의 확산으로 인해 OP가 제안한 무차별 인력 이외의 불규칙한 시계열이 비닝되는 접근 방식이 있어야합니다. 다음은 사용할 수있는 간격을 얻는 "고급"방법 중 하나입니다. aggregate et al, 버전을 사용합니다 cut 정의되었습니다 chron 사물.

require(chron)
require(timeSeries)

my.times <- "
2010-01-13 03:02:38 UTC
2010-01-13 03:08:14 UTC
2010-01-13 03:14:52 UTC
2010-01-13 03:20:42 UTC
2010-01-13 03:22:19 UTC
"

time.df <- read.delim(textConnection(my.times),header=FALSE,sep="\n",strip.white=FALSE)
time.seq <- seq(trunc(timeDate(time.df[1,1]),units="hours"),by=15*60,length=nrow(time.df))
intervals <- as.numeric(cut(as.chron(as.character(time.df$V1)),breaks=as.chron(as.character(time.seq))))

당신은 얻습니다

intervals  
[1] 1 1 1 2 2

이제 데이터 프레임 및 집계에 추가 할 수 있습니다.

위의 Coersion Acrobatics (캐릭터에서 시간에 따라 문자로, 크론으로)는 약간 불행한 일이므로 XTS 또는 다른 Timeseries 패키지를 사용하여 불규칙한 시간 데이터를 바이닝하기위한 더 깨끗한 솔루션이 있으면 그들에 대해서도 듣고 싶습니다. ! .. ..

또한 대규모 고주파 불규칙 시계열을 바이닝하기위한 가장 효율적인 접근 방식이 무엇인지 궁금합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top