저는 각 행 항목이 동작이며 시간 소인이있는 관찰 동작 데이터를 조작하고 있습니다. 데이터 세트에는 여러 관측 기간이 포함되며 동작은 Epoch 시간 표기법을 사용하는 타임 스탬프와 함께 실시간으로 기록됩니다. 데이터 프레임에 각 관측 기간 내에 시간대를 표시하는 새 열을 만들고 싶습니다. 특히, 각 관측 기간의 시작부터 5 분 간격으로 행 항목에 레이블을 지정하려고합니다. (고정 된 기간 동안 다른 행동의 빈도를 계산하려면이 값을 사용해야합니다.)5 분 시간 블록 만들기 (팬더 / 파이썬)
observation epoch behavior timeblock
1 12973561838 vo 1
1 12973561870 bc 1
1 12973561944 xp 2
1 12973562055 vo 3
1 12973562106 vo 3
2 12731709280 wc 4
2 12731709322 we 5
2 12731709361 vb 5
2 12731709374 vw 5
...
: 내가 같이 할 수있는 제품을 원하는 무엇
observation epoch behavior
1 12973561838 vo
1 12973561870 bc
1 12973561944 xp
1 12973562055 vo
1 12973562106 vo
2 12731709280 wc
2 12731709322 we
2 12731709361 vb
2 12731709374 vw
...
은 다음과 같다 : 데이터는 (관련된 더 많은 열이있다,하지만 난 프리젠 테이션의 편의를 위해 그들을 밖으로 떠 났어요)과 같이
여기서 "타임 블록"# 1에는 첫 번째 관찰 시간 # 1 분이 포함되며, # 2 시간에는 5시에서 9시 59 분까지 ...에서 25시 이후까지가 관찰 기간마다 포함됩니다. 이 예에서 # 4에는 관찰 기간 # 2의 첫 번째 4:59 분이 포함됩니다. (Epoch 시간 값이 여기 내 시간 블록과 일치하지 않는다는 것을 알지만, 데이터를 축약하고 우연히 일부 타임 스탬프를 잡았 기 때문에이 값이 이해가되지 않을 것입니다.)
내가 지금까지 해봤 던 것 : 나는 groupby와 함꺼 혼란스러워했고 별도의 데이터 프레임에서 각각의 관찰 기간 동안 5 분 시간 블록의 시작과 끝에서 실제 에포크 값을 계산했습니다. 그러나 각 관측 기간에 대해 여러 값이있는 위의 원래 데이터 프레임에서 관측 기간 당 적용되는 함수에서 이들을 가져 오는 방법을 알 수는 없습니다. 나는 그 대답이 groupby와 적용 방법에 대한 더 나은 이해에 있다고 의심하지만, 이것을 땅에 떨어 뜨리는 데 어려움을 겪고있다. (또한 어쩌면 정확한 검색 용어를 사용하지 않고 있지만, 포럼에 이미 게시 된 내용을 많이 찾지는 못하고 있습니다. 단지 timeseries 작업에 대한 정보 만 찾을 수 있습니다.) 두 가지 옵션은 내가 생각했지만 프로그램하는 방법을 알아낼 수 없습니다 :
내가 최소한의 신기원 값을 기준으로 5 분 소요 시간 블록으로 기간을 분할 할 수있는 각각의 관찰 기간 동안 실제 에포크의 시점을 계산 관측 기간마다 (이 부분은 완료되었습니다.), 이것을 사용하여 시간 블록 레이블의 열을 생성하십시오 (이 부분은 제가 막혔습니다).
관측 기간의 각 에피 크 값에 기초하여 관측 기간 내의 각 행 항목에 대한 시작 시간을 계산하십시오 (여기에 붙어 있습니다). 그런 다음 관측 기간마다 다른 값 목록을 사용하는 대신 (개념적 솔루션 # 1에서와 같이) 표준 범위의 값 (분 0에서 4:59, 5에서 9:59 등)을 사용하여 시간 블록 레이블. 나도 이걸 시작하는 방법에 붙어있다.
귀하의 도움에 감사드립니다! 나는이 점을 넣었습니다
g_follow = teach_freq['Epoch'].groupby(teach_freq['observation'])
start_follow = g_follow.min()
:
업데이트 설명은
아래 이미 각 '관찰'기간 동안 초기 타임 스탬프의 테이블을 만들 GROUPBY을 사용했습니다 max (각 '관찰'기간의 끝 타임 스탬프를 표시)와 함께 데이터 프레임즉, 225 '관찰'주기로 다음 dataframe 생산 각 '관찰'주기가 다른 '분'값 또는 서로 다른 시작 시간을 갖는다
observation min max
1 12973561838 12973563058
2 12973571418 12973572718
3 12973825256 12973826474
...
참고. 위의 옵션 # 1은 필자의 큰 데이터베이스에서 각 'Epoch'항목의 각 관찰에 대해 '최소'코드를 빼는 코드를 작성해야한다는 것을 의미합니다.
UPDATE :
#where the dataframe with timeblocks & start times is named blocks
#each observation period is in column 'follow'
#and each start time for the observation periods is in column 'first'
min_time = lambda row: row['Epoch'] - blocks[blocks['follow'] == row['follow']]['first']
얹는 : 드미트리의 제안 코드를 기반으로, 나는 다음과 같은 사용하려고 해요
#where the dataframe with observed & timestamped behaviors is named teach_freq
teach_freq['std_epoch'] = teach_freq.apply(min_time, axis=1)
하지만이 프로그램을 실행할 때 나는 다음과 같은 오류가 발생합니다 :
를ValueError: Wrong number of items passed 1, indices imply 225
좋아, 이것은 약간의 진전을 이루고 있습니다. 그러나 각각의 관찰 기간은 다른 시간에 시작됩니다 (날짜와 시간은 3 개월 이상 펼쳐집니다). 따라서 모든 '신기원'데이터에서 1 단계를 수행 할 수는 없습니다. 각 '관찰'그룹별로 별도로 적용해야합니다. 마찬가지로 '관찰'그룹에서 2 단계를 수행해야합니다. 그래서 나는 행동 계획이 당신이 제공 한 접근법을 사용하는 것이라고 생각하지만 groupby를 통해 적용 할 것입니다. –
위의 설명을 추가했습니다. 5 분 시간 블록은 첫 번째 기간의 시작보다는 각 '관찰'기간의 시작을 기반으로해야합니다. –
답변을 업데이트했습니다. 당신이 만든 데이터 프레임을 기반으로 오른쪽 분 값을 얻을 수 있고 신기원 열 – Dmitry