Python 从数据帧获取日期差异

Python 从数据帧获取日期差异,python,python-2.7,python-3.x,pandas,datetime,Python,Python 2.7,Python 3.x,Pandas,Datetime,我正在尝试基于另一个现有列向数据帧添加列 数据帧的格式如下 col1 col2 2017-02-1 2017-03-03 2017-02-22 2017-03-06 from datetime import datetime date_format = "%Y-%m-%d" df['TimeConsumed']=df['col2'].apply(lambda x: (datetime.strptime(x,date_format)-datetime.strptim

我正在尝试基于另一个现有列向数据帧添加列

数据帧的格式如下

col1         col2 
2017-02-1    2017-03-03
2017-02-22   2017-03-06


from datetime import datetime
date_format = "%Y-%m-%d"
df['TimeConsumed']=df['col2'].apply(lambda x: (datetime.strptime(x,date_format)-datetime.strptime(df['col1'],date_format)).days)
运行上面的程序,它会不断地

TypeError: must be string, not Series 

谁能帮点忙吗

发生该错误的原因是您试图对仅支持字符串的序列执行strtime:

datetime.strptime(df['col1'], date_format)
我认为您需要在每行上进行减法,然后您需要在行上应用,而不是在一列上应用,如下所示:

import pandas as pd
from datetime import datetime


def substract(df):
    date_format = "%Y-%m-%d"
    return (datetime.strptime(df['col2'],date_format)-    datetime.strptime(df['col1'],date_format)).days

if __name__ == '__main__':

    df = pd.DataFrame([{'col1':'2017-02-01','col2':'2017-03-03'},{'col1':'2017-02-22','col2':'2017-03-06'}])
    print df

    #date_format = "%Y-%m-%d"
    #df['TimeConsumed']=df['col2'].apply(lambda x: (datetime.strptime(x,date_format)-datetime.strptime(df['col1'],date_format)).days)
    df["TimeConsumed"] = df.apply(substract, axis=1)
    print df
输出:

        col1        col2  TimeConsumed
0  2017-02-01  2017-03-03            30
1  2017-02-22  2017-03-06            12

可能是刚测试的复制品,它可以工作。但是我想知道为什么我的代码中的“datetime.strtime(x,date_格式)”适用于series,我认为在lambda函数中,它适用于该列的每个单元格。我错了吗?在你的代码中也有“datetime.strTime(df['col2',date_format)”,和我的一样,我很困惑,同一个代码是如何为你工作的,而不是我当调用df.apply(func)时,实际上func将在每一行上工作的,这意味着func中的df['col1',和df['col2']是字符串而不是序列。对于您的代码,它是df['col2'].apply,因此它在df['col2'](Series)中的每一行上都起作用,而它里面的df['col1']仍然是字符串以外的系列。所以这意味着“datetime.strtime(df['col1'],date_format)”应该在lambda函数之外工作,对吗?不,datetime.strpttime只接受字符串作为输入。它在我的代码中起作用的原因是,我们在该函数上使用apply,从doc中可以看到apply用于在每一行上调用func,这意味着func中的实际df['col1']不是Series:)