2016-12-30 64 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