날짜와 같은 기본 dtype DataFrames 및 시리즈에 저장된 값은 NumPy datetime64[ns]
입니다. datetime64[ns]
값의 배열이 정식 초에 "잘립니다"할 수있다, 분, 시간, 일, 주, 월 또는 연도 (해당 장치에 의해 대체된다 ?
astype('datetime64[?]')
을 호출하여 예 : s
, m
, h
, D
, W
, M
, Y
).
여기에 우리의 문제는 각 날짜를 정식 주간으로 분류 할 수 있다면 크게 해결 될 것입니다. 우리는 .astype('datetime64[W]')
를 사용하여이 작업을 수행 할 수 있습니다
In [152]: df1['Week'] = df1['Date'].values.astype('datetime64[W]'); df1
Out[152]:
Company Date Group People Week
0 A 2015-01-07 X 5 2015-01-01
1 A 2015-01-14 X 10 2015-01-08
2 A 2015-01-07 XX 6 2015-01-01
3 A 2015-01-14 XX 12 2015-01-08
4 B 2015-01-07 Y 4 2015-01-01
5 B 2015-01-14 Y 8 2015-01-08
6 B 2015-01-07 YY 5 2015-01-01
7 B 2015-01-14 YY 4 2015-01-08
이
df1
및
df2
모두이 일을하는 데, 우리는 지금
['Week', 'Group', 'Company']
에 DataFrames을 병합 할 수 있습니다. 이것은 df1과 df2의 해당 행과 일치합니다. 따라서 Value to People의 비율을 찾는 것이 쉽습니다.
import pandas as pd
df1 = pd.DataFrame({'Company': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'Date': ['01/07/2015', '01/14/2015', '01/07/2015', '01/14/2015', '01/07/2015', '01/14/2015', '01/07/2015', '01/14/2015'], 'Group': ['X', 'X', 'XX', 'XX', 'Y', 'Y', 'YY', 'YY'], 'People': [5, 10, 6, 12, 4, 8, 5, 4]})
df2 = pd.DataFrame({'Company': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B'], 'Date': ['01/04/2015', '01/06/2015', '01/13/2015', '01/05/2015', '01/06/2015', '01/11/2015', '01/14/2015', '01/05/2015', '01/07/2015', '01/13/2015', '01/14/2015', '01/03/2015', '01/11/2015', '01/14/2015'], 'Group': ['X', 'X', 'X', 'XX', 'XX', 'XX', 'XX', 'Y', 'Y', 'Y', 'Y', 'YY', 'YY', 'YY'], 'Value': [5, 10, 15, 6, 9, 9, 12, 4, 6, 16, 24, 10, 10, 12]})
for df in [df1, df2]:
df['Date'] = pd.to_datetime(df['Date'])
df['Week'] = df['Date'].values.astype('datetime64[W]')
result = pd.merge(df2, df1, how='left', on=['Week', 'Group', 'Company'], suffixes=['', '_1'])
result['Value/People'] = result['Value']/result['People']
result = result[['Company', 'Group', 'Date', 'Value/People']]
print(result)
수익률
정규 주에 날짜를자를 때 고려 될 필요가있다 "기본 오프셋"문제가 있음을
Company Group Date Value/People
0 A X 2015-01-04 1.00
1 A X 2015-01-06 2.00
2 A X 2015-01-13 1.50
3 A XX 2015-01-05 1.00
4 A XX 2015-01-06 1.50
5 A XX 2015-01-11 0.75
6 A XX 2015-01-14 1.00
7 B Y 2015-01-05 1.00
8 B Y 2015-01-07 1.50
9 B Y 2015-01-13 2.00
10 B Y 2015-01-14 3.00
11 B YY 2015-01-03 2.00
12 B YY 2015-01-11 2.50
13 B YY 2015-01-14 3.00
참고. 즉, 일주일에 언제 시작해야하는지 결정해야합니다. 정규 선택이 df['Date'].values.astype('datetime64[W]')
인 것으로 마음에 들지 않으면 날짜에 오프셋을 추가해야 할 수 있습니다. 예를 들어, 당신이 사용할 수 df['Date']
에 날짜에 하루를 추가합니다 :
(df['Date'].values + np.timedelta64(1, 'D')).astype('datetime64[W]')
날짜가 고유하지 않은, 그래서 당신은 일주일 동안 값으로 나눌 때하는 일 폭포 ...하는 값 당신이 선택합니까? 이 데이터만으로는 충분하지 않습니다. 시도한 루프를 보여주십시오. – piRSquared
해당 회사 및 그룹을 기준으로 가치를 선택하고 싶습니다. 예를 들어 df2 (회사 A 및 그룹 X)의 첫 번째 행에 대해 회사 A, 그룹 X에 해당하는 df1의 행으로 값을 나누고 싶습니다. 여기서 df2 (01/04/2015)의 날짜는 df1 (01/07/2015)의 주에 이 점을 분명히하기 위해 제 질문을 수정했습니다. – user3357979