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:)