2017-05-16 91 views
1

我想在另一個數據幀列中增加一個整數值的日期。在pandas數據框中添加其他數據幀的日期

我收到類型錯誤:爲timedelta天組件不支持的類型:numpy.int64

我dataframes是這樣的:

import pandas as pd 
import numpy as np 
import datetime as dt 

dfa = pd.DataFrame([ 
    ['5/15/17',1], 
    ['5/15/17',1]], 
    columns = ['Start','Days']) 

dfb = pd.DataFrame([ 
    ['5/15/17',1], 
    ['5/15/17',1]], 
    columns = ['Start','Days']) 

我格式化 '開始' 列,使用此代碼日期時間:

dfa['Start'] = dfa['Start'].apply(lambda x: 
            dt.datetime.strptime(x,'%m/%d/%y')) 
dfb['Start'] = dfb['Start'].apply(lambda x: 
            dt.datetime.strptime(x,'%m/%d/%y')) 

我嘗試更改dfa數據框中的值。在DFB數據框參考作品「天」,但不是「開始」:

for i, row in dfb.iterrows(): 
    for j, row in dfa.iterrows(): 
     new = pd.DataFrame({"Start": dfa.loc[j,"Start"] + datetime.timedelta(days=dfb.loc[i,"Days"]), "Days": dfa.loc[j,"Days"] - dfb.loc[i,"Days"]}, index = [j+1]) 
     dfa = pd.concat([dfa.ix[:j], new, dfa.ix[j+1:]]).reset_index(drop=True) 

這是引發錯誤的關鍵組成部分:

「開始」:dfa.loc [J,「開始」 ] + datetime.timedelta(天= dfb.loc [我, 「天」]

它正常工作,如果我使用:

「開始」:dfa.loc [J, 「開始」] +的日期時間。 timedelta(天= 1)

但我需要它採取臨時來自dfb的t值,不是一個靜態整數。

回答

1

IIUC(我改變了輸入值有點澄清是怎麼回事):

import pandas as pd 

dfa = pd.DataFrame([ 
    ['5/15/17',1], 
    ['5/16/17',1]], 
    columns = ['Start','Days']) 

dfb = pd.DataFrame([ 
    ['5/15/17',3], 
    ['5/16/17',4]], 
    columns = ['Start','Days']) 

dfa['Start'] = pd.to_datetime(dfa['Start']) 

dfb['Start'] = pd.to_datetime(dfb['Start']) 

dfa['Start'] = dfa['Start'] + dfb['Days'].apply(pd.Timedelta,unit='D') 
print(dfa) 

輸出:

 Start Days 
0 2017-05-18  1 
1 2017-05-20  1 
+0

這似乎像它應該工作,它與您的代碼的做法,但當我將它作爲dfb.loc [i,'Days'] apply(pd.Timedelta,unit ='D')放入我的實際代碼中時,它引發:AttributeError:'numpy.int64'對象沒有屬性'apply' 。 – swysell

+0

哦,但如果我刪除「.loc [我,」它確實有效。我假設我需要保留那個索引的參考,但也許情況並非如此? – swysell

+0

關於熊貓的一件很酷的事情是,它本質上是做索引對齊的事情。如果dfa和dfb看起來相似,那麼它將對齊索引。如果dfa和dfb處於不同的排序順序,您也可以在兩者上使用set_index('Date')來獲得對齊。 –

相關問題