2017-05-16 131 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')来获得对齐。 –

相关问题