타임 스탬프가 불규칙한 시간 간격 내에있는 행 가져 오기 Pandas (시계열)

사얀 디프 두타

다음과 같은 데이터 프레임이 있다고 가정 해 보겠습니다.

>>> i = pd.to_datetime(np.random.randint(time.time(), time.time()+10000, 15), unit='ms').sort_values()
>>> df = pd.DataFrame({'A':range(15),'B':range(10,40,2),'C':range(10,55,3)},index = i)
>>> df
                          A   B   C
1970-01-19 05:31:36.629   0  10  10
1970-01-19 05:31:36.710   1  12  13
1970-01-19 05:31:37.779   2  14  16
1970-01-19 05:31:38.761   3  16  19
1970-01-19 05:31:39.520   4  18  22
1970-01-19 05:31:39.852   5  20  25
1970-01-19 05:31:39.994   6  22  28
1970-01-19 05:31:41.370   7  24  31
1970-01-19 05:31:41.667   8  26  34
1970-01-19 05:31:42.515   9  28  37
1970-01-19 05:31:42.941  10  30  40
1970-01-19 05:31:43.037  11  32  43
1970-01-19 05:31:43.253  12  34  46
1970-01-19 05:31:43.333  13  36  49
1970-01-19 05:31:44.135  14  38  52

내가 원하는 것은 :

                          A   B   C
1970-01-19 05:31:37.779   2.0  14.0  16.0   #last value within 2000 milli-sec interval from 05:31:36
1970-01-19 05:31:38.761   3.0  16.0  19.0      ##last value from the ^ value within 1000 msec interval
1970-01-19 05:31:39.994   6.0  22.0  28.0   #last value within 2000 milli-sec interval from 05:31:38
1970-01-19 05:31:39.994   6.0  22.0  28.0     *##last value from the ^ value within 1000 msec interval
1970-01-19 05:31:41.667   8.0  26.0  34.0   #last value within 2000 milli-sec interval from 05:31:40
1970-01-19 05:31:42.515   9.0  28.0  37.0      ##last value from the ^ value within 1000 msec interval
1970-01-19 05:31:43.333  13.0  36.0  49.0   #last value within 2000 milli-sec interval from 05:31:42
1970-01-19 05:31:44.135  14.0  38.0  52.0      ##last value from the ^ value within 1000 msec interval

#이 코드 s로 표시된 행을 얻을 수 있습니다 .

>>> df.resample('2000ms').ffill().dropna(axis=0)
                        A     B     C
1970-01-19 05:31:38   2.0  14.0  16.0
1970-01-19 05:31:40   6.0  22.0  28.0
1970-01-19 05:31:42   8.0  26.0  34.0
1970-01-19 05:31:44  13.0  36.0  49.0

# note I do not care about how the timestamps are getting printed, I just want the correct values.

원하는 결과를 얻을 수있는 pandas 솔루션을 찾을 수 없습니다. 두 개의 데이터 프레임을 사용하여이 작업을 수행 할 수 있습니다. 하나는 샘플링 된 2000ms것이고 다른 하나는 샘플링 된 1000ms다음 아마도 루프하고 그에 따라 삽입 할 수 있습니다.

문제는 내 데이터의 실제 크기가 4000000 개 이상의 행과 52 개의 열로 정말 크다는 것입니다. 두 개의 dfs 또는 루프를 피할 수 있다면 확실히하고 싶을 것입니다.

참고 : *마지막 값에서 1000ms 시간 간격 내에 데이터가 없으므로 표시된 행이 반복되므로 마지막으로 본 값이 반복됩니다. 2000ms 시간 간격에서도 마찬가지입니다.

가능하다면 방법을 보여주세요 ... 감사합니다!

편집 : John Zwinck의 의견에 따라 편집 :

import datetime
def last_time(time):
    time = str(time)
    start_time = datetime.datetime.strptime(time[11:],'%H:%M:%S.%f')
    end_time = start_time + datetime.timedelta(microseconds=1000000)
    tempdf = df.between_time(*pd.to_datetime([str(start_time),str(end_time)]).time).iloc[-1]
    return tempdf
df['timestamp'] = df.index
df2 = df.resample('2000ms').ffill().dropna(axis=0)
df3 = df2.apply(lambda x:last_time(x['timestamp']), axis = 1)

pd.concat([df2, df3]).sort_index(kind='merge')

이것은 다음을 제공합니다.

                        A     B     C               timestamp
1970-01-19 05:31:38   2.0  14.0  16.0 1970-01-19 05:31:37.779
1970-01-19 05:31:38   3.0  16.0  19.0 1970-01-19 05:31:38.761
1970-01-19 05:31:40   6.0  22.0  28.0 1970-01-19 05:31:39.994
1970-01-19 05:31:40   6.0  22.0  28.0 1970-01-19 05:31:39.994
1970-01-19 05:31:42   8.0  26.0  34.0 1970-01-19 05:31:41.667
1970-01-19 05:31:42   9.0  28.0  37.0 1970-01-19 05:31:42.515
1970-01-19 05:31:44  13.0  36.0  49.0 1970-01-19 05:31:43.333
1970-01-19 05:31:44  14.0  38.0  52.0 1970-01-19 05:31:44.135

적용 부분이 정말 오래 걸리는 것을 제외하면 괜찮습니다!


더 쉬운 복사를 위해 :

,A,B,C
1970-01-19 05:31:36.629,0,10,10
1970-01-19 05:31:36.710,1,12,13
1970-01-19 05:31:37.779,2,14,16
1970-01-19 05:31:38.761,3,16,19
1970-01-19 05:31:39.520,4,18,22
1970-01-19 05:31:39.852,5,20,25
1970-01-19 05:31:39.994,6,22,28
1970-01-19 05:31:41.370,7,24,31
1970-01-19 05:31:41.667,8,26,34
1970-01-19 05:31:42.515,9,28,37
1970-01-19 05:31:42.941,10,30,40
1970-01-19 05:31:43.037,11,32,43
1970-01-19 05:31:43.253,12,34,46
1970-01-19 05:31:43.333,13,36,49
1970-01-19 05:31:44.135,14,38,52
존 즈 윙크

기존 코드의 느린 부분은를 생성하는 df3것이므로 최적화하겠습니다.

먼저 last_time(x)함수가 x에서 x + 1 초까지의 시간 범위 내에서 마지막 레코드를 찾습니다.

루프를 사용하는 대신 전체 벡터에서 시간을 오프셋하여 시작할 수 있습니다.

end_times = df2.timestamp + datetime.timedelta(microseconds=1000000)

그런 다음 numpy.searchsorted()(매우 과소 평가 된 기능!)을 사용하여 다음 에서 해당 시간을 검색 할 수 있습니다 df.

idx = np.searchsorted(df.timestamp, end_times)

덧붙여서, df.timestamp.searchsorted(end_times)같은 일을합니다.

마지막으로, 생성 된 각각의 인덱스는 우리가 원하는 것 (1 초 후의 값을 원하지 않고 바로 앞의 값을 원함) 뒤에 하나씩 있음을 유의하십시오.

df3a = df.iloc[idx - 1]

이것은 df3인덱스가 반올림되지 않는다는 점을 제외하고 는 동일한 결과를 제공 하므로 교체하십시오.

df3a.index = df2.index

이것은 당신의과 정확히 동일 df3하지만 훨씬 더 빨리 계산됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

gmt 타임 스탬프에서 epoch 시간 가져 오기

분류에서Dev

int를 타임 스탬프로 변환 Elasticsearch에서 시간 가져 오기

분류에서Dev

BigQuery에서 시간대 이름 양식 타임 스탬프 가져 오기

분류에서Dev

Google 문서 타임 스탬프에서 총 시간 가져 오기

분류에서Dev

시간대없이 타임 스탬프에서 날짜 가져 오기

분류에서Dev

UTC의 날짜 및 시간에서 타임 스탬프 가져 오기

분류에서Dev

주말 시간을 제외한 Postgres의 타임 스탬프에 간격 시간을 추가하는 방법

분류에서Dev

타이머가 똑딱 거리는 동안 불규칙한 간격으로 무언가를하십시오

분류에서Dev

타이머가 똑딱 거리는 동안 불규칙한 간격으로 무언가를하십시오

분류에서Dev

자정에 시간과 분에 대한 타임 스탬프 개체 가져 오기

분류에서Dev

동일한 pandas DatetimeIndex 객체에서 시간대가 다른 타임 스탬프?

분류에서Dev

해당 행의 지난 1 시간 이내에 타임 스탬프가있는 행 수

분류에서Dev

이벤트의 타임 스탬프가 시간 간격 내에 있는지 확인

분류에서Dev

요일 및 시간 열을 연결하여 타임 스탬프 가져 오기

분류에서Dev

타임 스탬프 Android에서 날짜 및 시간을 가져 오려면

분류에서Dev

타임 스탬프 Android에서 날짜 및 시간을 가져 오려면

분류에서Dev

datetime : 시간대 오프셋으로 타임 스탬프 가져 오기

분류에서Dev

타임 스탬프가 24 시간보다 큰 문서 가져 오기

분류에서Dev

불규칙한 H : M : S 타임 스탬프 데이터를 R의 시간 간격으로 결합

분류에서Dev

Python : 타임 스탬프에서 시간대 시간을 추가 또는 제거하고 실제 시간 가져 오기

분류에서Dev

Pandas Timedelta는 기존 타임 스탬프에 십진수 시간을 추가합니다.

분류에서Dev

불규칙한 시계열 간격이있는 HighCharts 오차 막대

분류에서Dev

불규칙한 간격의 (x, y) 시리즈에 대한 가우스 필터?

분류에서Dev

다른 열을 기반으로 Netezza의 타임 스탬프에 시간 추가

분류에서Dev

타임 스탬프 열에서 시간없이 데이터를 가져 오는 SQL 쿼리

분류에서Dev

Python의 시간대 인식 datetime 객체에서 UTC 타임 스탬프 가져 오기

분류에서Dev

시간대가있는 다이 그래프 타임 스탬프

분류에서Dev

타임 스탬프에 시간을 추가하기 위해 MySQL의 모든 행 업데이트 : "Column 'start'cannot be null"

분류에서Dev

PostgreSQL에서 여러 사용자가있는 타임 스탬프 및 겹치는 시간 범위에서 간격 찾기

Related 관련 기사

  1. 1

    gmt 타임 스탬프에서 epoch 시간 가져 오기

  2. 2

    int를 타임 스탬프로 변환 Elasticsearch에서 시간 가져 오기

  3. 3

    BigQuery에서 시간대 이름 양식 타임 스탬프 가져 오기

  4. 4

    Google 문서 타임 스탬프에서 총 시간 가져 오기

  5. 5

    시간대없이 타임 스탬프에서 날짜 가져 오기

  6. 6

    UTC의 날짜 및 시간에서 타임 스탬프 가져 오기

  7. 7

    주말 시간을 제외한 Postgres의 타임 스탬프에 간격 시간을 추가하는 방법

  8. 8

    타이머가 똑딱 거리는 동안 불규칙한 간격으로 무언가를하십시오

  9. 9

    타이머가 똑딱 거리는 동안 불규칙한 간격으로 무언가를하십시오

  10. 10

    자정에 시간과 분에 대한 타임 스탬프 개체 가져 오기

  11. 11

    동일한 pandas DatetimeIndex 객체에서 시간대가 다른 타임 스탬프?

  12. 12

    해당 행의 지난 1 시간 이내에 타임 스탬프가있는 행 수

  13. 13

    이벤트의 타임 스탬프가 시간 간격 내에 있는지 확인

  14. 14

    요일 및 시간 열을 연결하여 타임 스탬프 가져 오기

  15. 15

    타임 스탬프 Android에서 날짜 및 시간을 가져 오려면

  16. 16

    타임 스탬프 Android에서 날짜 및 시간을 가져 오려면

  17. 17

    datetime : 시간대 오프셋으로 타임 스탬프 가져 오기

  18. 18

    타임 스탬프가 24 시간보다 큰 문서 가져 오기

  19. 19

    불규칙한 H : M : S 타임 스탬프 데이터를 R의 시간 간격으로 결합

  20. 20

    Python : 타임 스탬프에서 시간대 시간을 추가 또는 제거하고 실제 시간 가져 오기

  21. 21

    Pandas Timedelta는 기존 타임 스탬프에 십진수 시간을 추가합니다.

  22. 22

    불규칙한 시계열 간격이있는 HighCharts 오차 막대

  23. 23

    불규칙한 간격의 (x, y) 시리즈에 대한 가우스 필터?

  24. 24

    다른 열을 기반으로 Netezza의 타임 스탬프에 시간 추가

  25. 25

    타임 스탬프 열에서 시간없이 데이터를 가져 오는 SQL 쿼리

  26. 26

    Python의 시간대 인식 datetime 객체에서 UTC 타임 스탬프 가져 오기

  27. 27

    시간대가있는 다이 그래프 타임 스탬프

  28. 28

    타임 스탬프에 시간을 추가하기 위해 MySQL의 모든 행 업데이트 : "Column 'start'cannot be null"

  29. 29

    PostgreSQL에서 여러 사용자가있는 타임 스탬프 및 겹치는 시간 범위에서 간격 찾기

뜨겁다태그

보관