2016-12-30 36 views
1

我有3列IDvrddatenddat和21000行的數據集。:pd.date_range輸出誤差

ID  vrddat  enddat 
1  2015.01.01 2015.01.03  
2  2015.03.01 2015.03.03 

PS:每個ID可以有多個vrddat的和enddat的。

我需要如下輸出:

ID  vrddat  enddat  day 
1 2015.01.01 2015.01.03 2015.01.01 
1 2015.01.01 2015.01.03 2015.01.02 
1 2015.01.01 2015.01.03 2015.01.03 
2 2015.03.01 2015.03.03 2015.03.01 
2 2015.03.01 2015.03.03 2015.03.02 
2 2015.03.01 2015.03.03 2015.03.03 

我用下面的代碼獲取上述輸出

for index,row in data.iterrows(): 
    data_2 = pd.DataFrame(pd.date_range(row['vrddat'],row['enddat'], freq ='D')) 

使用上面的代碼我得到的只有98行,但理想的輸出應包含比輸入更多的行。任何人都可以建議我爲什麼得到這種產出。我的代碼是不是迭代每一行?如何在我的輸出中獲得IDvrddatenddat變量?

請建議。

回答

1

可以使用第一投to_datetime兩列vrddatenddat然後用itertuplesconcat創建新拓展DataFrame。最後merge,但有必要IDdf是唯一的。

df.vrddat = pd.to_datetime(df.vrddat) 
df.enddat = pd.to_datetime(df.enddat) 

df1 = pd.concat([pd.Series(r.ID,pd.date_range(r.vrddat, r.enddat)) for r in df.itertuples()]) 
     .reset_index() 
df1.columns = ['day','ID'] 
print (df1) 
     day ID 
0 2015-01-01 1 
1 2015-01-02 1 
2 2015-01-03 1 
3 2015-03-01 2 
4 2015-03-02 2 
5 2015-03-03 2 

print (pd.merge(df,df1, on='ID', how='left')) 
    ID  vrddat  enddat  day 
0 1 2015-01-01 2015-01-03 2015-01-01 
1 1 2015-01-01 2015-01-03 2015-01-02 
2 1 2015-01-01 2015-01-03 2015-01-03 
3 2 2015-03-01 2015-03-03 2015-03-01 
4 2 2015-03-01 2015-03-03 2015-03-02 
5 2 2015-03-01 2015-03-03 2015-03-03 

如果ID不是唯一的,可以使用unique指數用於合併:

df.vrddat = pd.to_datetime(df.vrddat) 
df.enddat = pd.to_datetime(df.enddat) 
df = df.reset_index() 

df1=pd.concat([pd.Series(r.index,pd.date_range(r.vrddat,r.enddat)) for r in df.itertuples()]) 
     .reset_index() 
df1.columns = ['day','index'] 
print (df1) 
     day index 
0 2015-01-01  0 
1 2015-01-02  0 
2 2015-01-03  0 
3 2015-03-01  1 
4 2015-03-02  1 
5 2015-03-03  1 

print (pd.merge(df,df1, on='index', how='left').drop('index', axis=1)) 
    ID  vrddat  enddat  day 
0 1 2015-01-01 2015-01-03 2015-01-01 
1 1 2015-01-01 2015-01-03 2015-01-02 
2 1 2015-01-01 2015-01-03 2015-01-03 
3 2 2015-03-01 2015-03-03 2015-03-01 
4 2 2015-03-01 2015-03-03 2015-03-02 
5 2 2015-03-01 2015-03-03 2015-03-03 
+0

非常感謝您抽出時間,你的代碼是有幫助的你知不知道爲什麼我只得到了98行在輸出?我錯過了一些邏輯? – ajay

+0

我想你會在每個循環中覆蓋'data_2',所以得到最後一個循環的輸出 - 在'df'中的最後一行。 – jezrael

+0

我修改了使用重複'ID'的解決方案。 – jezrael