【问题标题】:Adding to date in pandas dataframe with other dataframe value使用其他数据框值在 pandas 数据框中添加日期
【发布时间】:2017-05-16 15:24:16
【问题描述】:

我想将一个数据框列中的日期增加另一列中的整数值。

我收到 TypeError: timedelta days 组件不支持的类型:numpy.int64

我的数据框如下所示:

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 数据框参考适用于“Days”,但不适用于“Start”:

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,"Start"] + datetime.timedelta(days=dfb.loc[i,"Days"]

如果我使用它可以正常工作:

“开始”:dfa.loc[j,“开始”] + datetime.timedelta(days=1)

但我需要它从 dfb 中获取该值,而不是静态整数。

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 这似乎应该可以工作并且它适用于您的代码,但是当我将它作为 dfb.loc[i,'Days'].apply(pd.Timedelta,unit= 'D'),它会引发:AttributeError: 'numpy.int64' object has no attribute 'apply'。
    • 哦,但是如果我删除“.loc[i”,它确实有效。我假设我需要保留对我所在索引的引用,但也许情况并非如此?
    • 关于 pandas 的一个很酷的事情是它本质上是通过索引对齐来完成的。如果 dfa 和 dfb 看起来相似,那么它将在索引上对齐。如果 dfa 和 dfb 的排序顺序不同,您还可以同时使用 set_index('Date') 来正确对齐。
    • 而我选择使用 Pandas 对象而不是 datetime 模块对象,有一些细微的差别,但大部分情况下,Pandas 都使用了下面的 datetime 模块。
    • 在进一步的测试中,这个解决方案似乎不太奏效。我想可能是因为它在循环中保留了哪个“天”值,并且因为我在数据框中插入了一个新行?不知道如何在我发布的简化代码中向您展示这个问题,但在某些情况下,它不使用我想要的“天”值,而在其他情况下,它在“开始”列中返回“NaT”......跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 2019-11-10
    • 2022-12-14
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多