2014-01-08 2 views
1

특히 그룹별로 두 개의 날짜의 차이를 평균하여 확장하고 싶습니다. 나는 이런 식으로 뭔가를 그래서 만약 :팬더에서 그룹별로 창을 확대하는 방법

Period Group dates 
    1   A  2010-07-01 
    2   A  2010-07-13 
    3   A  2010-07-13 
    4   A  2010-07-21 
    1   B  2000-08-20 
    2   B  2000-08-15 

내가 얻을 것 :

Period Group cumulative average of differences 
    1   A  0 
    2   A  12/2 
    3   A  12/3 
    4   A  20/4 
    1   B  0 
    2   B  -5/2 
+0

는 2 B 값은 -5/2이어야한다 또한 상기 출력 포맷은 비트 청소기입니까? 당신은 궁극적으로 (플로트) 일 평균 차이를 찾고 있습니까? – Jeff

답변

1

나는 약간 긴 하나보다 대체 솔루션이있는 이전에 게시되었지만 날짜 열 변환 함수 내부에서 무슨 일이 벌어지고 있는지 쉽게 이해할 수 있다고 생각합니다.

import numpy as np 
import pandas as pd 
from datetime import date 

# Build data 
prd = [1, 2, 3, 4, 1, 2] 
grp = ['A', 'A', 'A', 'A', 'B', 'B'] 
yr = [2010, 2010, 2010, 2010, 2000, 2000] 
mth = [7, 7, 7, 7, 8, 8] 
day = [1, 13, 13, 21, 20, 15] 
dt = [date(y, m, d) for y, m, d in zip(yr, mth, day)] 
# Create data frame 
df = pd.DataFrame({'Period': prd, 'Group': grp, 'Dates': dt}, 
        columns=['Period', 'Group', 'Dates']) 

# Transformation function for the date column 
def f(ser): 
    v = ser.values 
    # Get time difference in days 
    delta = [float((ii-v[0]).days) for ii in v] 
    # Get number of items to divide by 
    dv = np.arange(len(delta))+1 
    # Get cumulative average 
    cumavg = [nm/dm for nm, dm in zip(delta, dv)] 
    # Create output pandas Series object and return it 
    out = pd.Series(cumavg, index=ser.index) 
    return out 

# Apply the transformation function to the Dates column 
dfappend = pd.DataFrame({'Cum_Avg': df.groupby("Group").Dates.apply(f)}) 
# Delete the Dates column 
del df['Dates'] 
# Merge to create the revised data frame 
df = pd.merge(df, dfappend, left_index=True, right_index=True) 
print(df) 

출력은 :

Period Group Cum_Avg 
0  1  A  0.0 
1  2  A  6.0 
2  3  A  4.0 
3  4  A  5.0 
4  1  B  0.0 
5  2  B  -2.5 
2
import pandas as pd 
import io 

data ="""Period Group dates 
1   A  2010-07-01 
2   A  2010-07-13 
3   A  2010-07-13 
4   A  2010-07-21 
1   B  2000-08-20 
2   B  2000-08-15""" 

df = pd.read_csv(io.BytesIO(data), delim_whitespace=True, parse_dates=[2]) 

def f(s): 
    t = s.diff().fillna(0).astype(np.int64) 
    return pd.expanding_mean(t).astype(np.int64).astype("timedelta64[ns]") 

r = df.groupby("Group").dates.apply(f) 
print r 

출력 :

0   00:00:00 
1 6 days, 00:00:00 
2 4 days, 00:00:00 
3 5 days, 00:00:00 
4   00:00:00 
5 -2 days, 12:00:00 
dtype: timedelta64[ns] 
+1

FYI 마지막 값을 부동 소수점 일 수로 변환하려면 결과를''np.timedelta (1, 'D')''로 나눌 수 있습니다. – Jeff

관련 문제