2017-05-05 1 views
4
내가 시작 날짜, 종료 날짜와 '세분화'

팬더 - 지정된 시작 날짜, 종료 날짜 및 단위

를 사용하여 날짜 인덱스 dataframe 리샘플링 할

를 사용하여 dataframe를 다시 샘플링 내가이 dataframe을 말해봐 :

    value 
00:00, 01/05/2017 2 
12:00, 01/05/2017 4 
00:00, 02/05/2017 6 
12:00, 02/05/2017 8 
00:00, 03/05/2017 10 
12:00, 03/05/2017 12 

와 나는 (이 단순 여기를 원본과 동일하지만 필요는 없습니다) 12 시간 '단위'로
18:00 02/05/201706:00, 01/05/2017에서 이동을 리샘플링합니다. 내가 원하는 결과는 다음과 같습니다 값들이 중복 값의 평균이다

    value 
06:00, 01/05/2017 3 
18:00, 01/05/2017 5 
06:00, 02/05/2017 7 
18:00, 02/05/2017 9 

하는 것으로 (예를 들어, 3 = 평균 (2,4))

이 작업을 수행하는 방법을 내가 확실 해요.

내 첫 번째 시도했다 : 이것은 적절하게 데이터 프레임을 손질하고 올바른 단위를 보장하지만 결과는 그래서 시작 날짜와 결과를 정렬하지 않습니다

def resample(df: DataFrame, start: datetime, end: datetime, granularity: timedelta) -> DataFrame: 
    result = df.resample(granularity).mean() 
    result = result[result.index <= end] 
    result = result[result.index >= start] 
    return result 

:

    value 
12:00, 01/05/2017 4 
00:00, 02/05/2017 6 
12:00, 02/05/2017 8 

두 번째 시도에서 base 매개 변수를 사용하여 데이터를 이동 시켰습니다.

def resample(df: DataFrame, start: datetime, end: datetime, desired_granularity: timedelta) -> DataFrame: 
    data_before_start = df[df.index <= start] 
    # Get the last index value before our start date 
    last_date_before_start = data_before_start.last_valid_index() 
    current_granularity_secs = seconds_between_measurements(df) 
    rule = str(int(desired_granularity.total_seconds())) + 'S' 
    base = current_granularity_secs - (start - last_date_before_start).total_seconds() 
    result = df.resample(rule, base=base).mean() 
    result = result[result.index < end] 
    result = result[result.index >= start] 
    return result 

이 나에게 제공합니다

    value 
06:00, 01/05/2017 4 
18:00, 01/05/2017 6 
06:00, 02/05/2017 8 
18:00, 02/05/2017 10 

이 오른쪽 인덱스를 가지고 있지만 값이 전후에 측정에서 다음 측정에서의 백업 광고보다는 평균된다.

내가 원하는 것을 얻을 수있는 방법에 대한 아이디어가있는 사람이 있습니까? 사전에

도와 주셔서 감사합니다 그냥 제가 탈락 한 경우 모든 중요한 세부 사항 :) 알려

편집 : 평균을 얻는 것은 경우이 매우 까다로운, 내가 할 수있는 만드는 비트 pad()와 비슷한 주어진 시간 전에 값을 사용하여 해결한다. 내 현재의 '최고의'솔루션을 통해 백필()과 같은 값을 얻을 수 있습니다.

답변

0

먼저 end_start 및 end_date 열을 datetime으로 정의하십시오. 안양에

  • 작성 전진과 df.start_date에

    • : 그런 다음, 당신은 .resample 두 번 사용할 수 있습니다.역방향 그런 다음

    를 작성하여 END_DATE : 시작일 < 종료일

  • CONCATENATE는
  • 업데이트 각 행에 함수를 적용

    • 보관할 행 시작일과 종료일 :

    여기에 코드 :

    ,364,893,712,913,223,210

    팬더 문서는 직접 다시 샘플링하는 것이 가능해야한다라고

    df.resample(freq, on='start_date')

  • 관련 문제