2014-10-24 1 views
0

다른 dateformats와 lenght를 가진 두 개의 csv 파일이 있습니다.다른 daterange와 다른 길이의 두 데이터 세트 일치

첫째, 나는이 두 파일을로드 :

frameA = pd.read_csv("fileA.csv", dtype=str, delimiter=";", skiprows = None) 

파일 A는 102,216 행 × 3 열이 01.07.2012 00:00에서 끝납니다. 날짜와 시간은 이고 한 열은입니다. 머리 모양은 다음과 같습니다.

Date     Buy  Sell 
0 01.08.2009 00:15 0  0 
1 01.08.2009 00:30 0  0 
2 01.08.2009 00:45 0  0 
3 01.08.2009 01:00 0  0 
4 01.08.2009 01:15 0  0 

frameB = pd.read_csv("fileB.csv", dtype=str, delimiter=";", skiprows = None) 

파일 B는 22.07.2012 00:00에서 종료, 92,762 행 × 4 열을 갖는다. 날짜와 시간은 각각 입니다. 헤드는 다음과 같습니다

 Date Time   Buy   Sell 
0 01.08.2009 01:00   0    0 
1 01.08.2009 02:00   0    0 
2 01.08.2009 03:00   0    0 
3 01.08.2009 04:00   0    10 
4 01.08.2009 05:00   0    32 

가 어떻게 이런이 datas를 일치시킬 수 있습니다 :

     Buy A Sell A Buy B Sell B 
0 01.08.2009 00:15 0  0  0  0 
1 01.08.2009 00:30 0  0  0  0 

모두 시작하고 같은 날짜로 종료하는 주파수가 15 분이어야합니다.

어떻게받을 수 있습니까? 먼저해야 할 일은 무엇입니까?

답변

1

OK, 우선 반드시 모두 DF 처음 DF에 대한 dtypes 같은 날짜 시간이의하는 것입니다 :

frameB = pd.read_csv("fileB.csv", dtype=str, delimiter=";", skiprows = None, parse_dates=[['Date','Time']]) 

지금 나는 분 값을 다시 것 :

frameA = pd.read_csv("fileA.csv", dtype=str, delimiter=";", skiprows = None, parse_dates=['Date']) 

다른 DF에 대한

그래서 같은 첫 DF의 :

In [149]: 

df['Date'] = df['Date'].apply(lambda x: x.replace(minute=0)) 
df 
Out[149]: 
        Date Buy Sell 
index        
0  2009-01-08 04:00:00 0 0 
1  2009-01-08 04:00:00 0 0 
2  2009-01-08 04:00:00 0 0 
3  2009-01-08 05:00:00 0 0 
4  2009-01-08 05:00:00 0 0 

이제 우리는 DFS를 병합 할 수 있습니다 :

In [150]: 

merged = df.merge(df1, left_on=['Date'], right_on=['Date_Time'], how='left',suffixes=[' A', ' B']) 
merged 
Out[150]: 
       Date Buy A Sell A   Date_Time Buy B Sell B 
0 2009-01-08 04:00:00  0  0 2009-01-08 04:00:00  0  10 
1 2009-01-08 04:00:00  0  0 2009-01-08 04:00:00  0  10 
2 2009-01-08 04:00:00  0  0 2009-01-08 04:00:00  0  10 
3 2009-01-08 05:00:00  0  0 2009-01-08 05:00:00  0  32 
4 2009-01-08 05:00:00  0  0 2009-01-08 05:00:00  0  32 

확실히 당신이 할 수있는 또 다른 한가지는 인덱스에 날짜 설정

+0

좋습니다. 감사! 나는 그것을 시험해 볼 것이다!! – EP1986

+1

df [ 'Date'] + pd.offsets.DateOffset (분 = 0, 초 = 0)은 시간을 표준화하는 약간의 트릭입니다. – Jeff

+0

@ Jeff thanks 제프, 유용한 트릭입니다. – EdChum

0

귀하의 경우 frameAframeBdf, df1 교체 : 올바르게 상태 이상

대답으로를 첫 번째 단계입니다 그들을 동일한 형식으로 파싱합니다. 우리는 합병 안내하는 데이터에 대한 인덱스를 설정할 수 있습니다, 위의 그림과 같이 배열에 데이터를 포함 후

frameA = pd.read_csv("fileA.csv", dtype=str, delimiter=";", skiprows = None, parse_dates=['Date']) 

frameB = pd.read_csv("fileB.csv", dtype=str, delimiter=";", skiprows = None, parse_dates=[['Date','Time']]) 

: 그들은 동일한 인덱스에 병합합니다, 그리고

frameA.index = frameA['Date'] 
frameB.index = frameB['Date'] 

을, 유사한 열 ('Buy', 'Sell')이 있으므로 합병에 대한 접미사를 지정해야합니다.

merge = frameA.join (frameB, lsuffix = 'A', rsuffix = 'B')

결과 이걸 똑같이 보일거야.

     Buy A Sell A Buy B Sell B 
0 01.08.2009 00:15 0  0  0  0 
1 01.08.2009 00:30 0  0  0  0 

이 방법의 장점은 두 번째 데이터 세트 ('주문 B', '판매의 B')가 첫 번째 슬롯에 존재하는 시간이없는 경우, 합병 여전히 작동하고 당신이없는 것입니다 데이터가 부적절한 시간에 잘못 할당되었습니다. 둘 다 1-10000 사이의 임의의 수치 인덱스를 가지고 있고 두 번째 데이터 프레임에 3 개의 값 (인덱스는 1-9997에서만 사용됨)이 누락되었다고 가정 해 봅시다. 이것은 교대를 일으키고, 우리는 부적절하게 값을 잘못된 색인에 할당하는 것은 합류를 유도하는 것입니다.

여기에서 결합을 안내하는 데이터 프레임이 두 번째 데이터 프레임보다 길면 데이터가 손실되지 않으며 잘못 색인에 잘못 할당하지 않습니다. 그래서 예를 들면

:

if len(frameA.index) >= len(frameB.index): 
    merge = frameA.join(frameB) 
else: 
    print 'Missing Values, define your own function here' 
    quit() 

편집 :

모든 데이터에 관계없이 모두 열 발생 여부는 고유 한 목록이있는 새로운 dataframe를 정의하는 것,보고되어 있는지 확인하는 또 다른 방법 두 데이터 프레임에 존재하는 날짜를 합하여이를 합병 가이드로 사용하십시오. 예를 들어

,

unique_index = sorted(list(set(frameA.index.tolist() + frameB.index.tolist()))) 

는 세트로 선회 두 인덱스리스트를 합산하여 고유 인덱스를 정의하고, 다시 목록. 세트는 모든 중복 값을 제거하므로 고유 한리스트를 가지며 세트는 정렬되지 않으므로 목록이 정렬됩니다.

merge = pd.DataFrame(index = unique_index) 
merge = merge.join(frameA) 
merge = merge.join(frameB, lsuffix = ' A', rsuffix = ' B') 

그냥 CSV 또는 자동으로 엑셀 시트에 수출 열 (으로 인덱스를 인덱스 ON으로 내보내거나 다시 정의해야합니다 인덱스에있다 :

그런 다음, 당신은 dataframes 병합 끄지 않으면 index = False로 설정하지 마십시오.

그리고 '구매 B', '판매 B'에있는 '구매 A', '판매 A'열의 누락 된 데이터는 '구매 B'에서 누락 된 데이터이므로 ' , 'Buy A', 'Sell A'에있는 'Sell B'.

+0

'정확히 다음과 같이 보일 때까지 코드를 실행합니다 :',하지만 지금은 09:15:00과 같은 올바른 timeformat을 가졌지 만 여전히 대답은 두 시간/date_columns입니다 EdChum의 뭐가 잘못 됐어? – EP1986

+0

날짜/시간을 인덱스로 설정하고 이동 했습니까? 데이터 프레임을 인쇄하기 전후에 데이터 프레임을 인쇄하거나 대화식 모드로이 데이터 프레임을 실행하는 것이 좋습니다.인덱스로 이동 한 경우 왼쪽에 나타나야하며 관련 열이 없어야합니다. 그런 다음 합병을 통해이 인덱스를 병합해야하며 하나의 인덱스 만 있어야합니다. 또 다른 방법은 모든 작업이 완료된 후에 항상 열을 삭제할 수 있다는 것입니다. df.drop ([column], axis = 1) –

+0

감사합니다. 나는 그것을 시험해 본다. – EP1986

관련 문제