减去两个日期时间以获得天数(python)

时间:2017-04-17 22:22:30

标签: python datetime

过去两天我一直围绕着这个问题,我正处于放弃的边缘。

我有一个名为Renewed_subscription的col,格式为datetime。我需要知道今天和一个人必须续订订阅之日的天数。

from datetime import datetime
dataset['DaysUntilSub'] = dataset.apply(lambda x: (pd.Timestamp.today().strftime('%Y-%m-%d') - str(dataset['Renewed_subscription'])).days, axis=1)

它抛出错误:

  

TypeError Traceback(最近一次调用最后一次)

     

C:\ Report.py in()

     

- > 166数据集[' DaysUntilSub'] = dataset.apply(lambda x :( pd.Timestamp.today()。strftime('%Y-%m-%d') - str(数据集[' Renewed_subscription']))。days,axis = 1)

     

168 #dataset [' DaysUntilSub'] = dataset.apply(lambda x:(pd.Timestamp.today()。strftime('%Y-%m-%d' ) - str(dataset [' Renewed_subscription']))。days,axis = 1)

     

C:\ Users \ katep \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py in apply(self,func,axis,broadcast,raw,reduce,args,** kwds)

     

4150如果reduce为None:      4151 reduce = True    - > 4152返回self._apply_standard(f,axis,reduce = reduce)      4153其他:      4154返回self._apply_broadcast(f,axis)

     

_apply_standard中的C:\ Users \ katep \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py(self,func,axis,ignore_failures,reduce)

     

4246尝试:

     

4247 for i,v in enumerate(series_gen):

     

- > 4248结果[i] = func(v)

     

4249 keys.append(v.name)

     

4250,例外情况除外:

     

C:\ Report.py in(x)

     

TypeError :("不支持的操作数类型 - - ' str'' str'",'发生在索引42&# 39)

如果你能指出我的错误,我将非常感激,因为我无法进行分析!

4 个答案:

答案 0 :(得分:1)

如上所述,您不希望在减法之前将datetime强制转换为字符串。您可以使用简单的-符号进行操作,然后查找days以后的数量。

from datetime import datetime
import pandas as pd

# create example dataframe
df = pd.DataFrame([datetime(1985, 4, 10), 
                   datetime(2010, 4, 10), 
                   datetime(2015, 4, 10), 
                   datetime(2017, 4, 10)], columns=['Renewed_subscription'])
# subtraction with today
df['DaysUntilSub'] = df['Renewed_subscription'].map(lambda x: (datetime.today() - x).days)

数据框输出

  Renewed_subscription  DaysUntilSub
0   1985-04-10  11695
1   2010-04-10  2564
2   2015-04-10  738
3   2017-04-10  7

没有lambda的相同解决方案:

def days_from_today(date):
    return (datetime.today() - date).days

df['DaysUntilSub'] = df['Renewed_subscription'].map(days_from_today)

答案 1 :(得分:0)

我认为问题是你试图从字符串中减去一个字符串。

代码pd.Timestamp.today()。strftime('%Y-%m-%d')生成一个字符串'2016-04-31',代码str(dataset ['Renewed_subscription'])转换为数据集到str。没有为字符串定义日期集的减号运算符。我会推荐以下内容: pd.Timestamp.today() - dataset ['Renewed_subscription']

这会给你timedelta对象。现在,您可以通过调用days函数将其转换为天数。 例如:

>>> import datetime
>>> a = datetime.datetime(2012, 9, 16, 0, 0)
>>> b = datetime.datetime.today()
>>> v = b-a
>>> v.days
1674
>>>

我希望这会有所帮助。 感谢

答案 2 :(得分:0)

您的问题是您尝试从另一个字符串中减去字符串。

<强>&#39;串&#39; - &#39;其他字符串&#39;

TypeError                                 Traceback (most recent call last)
<ipython-input-1-e61d76792339> in <module>()
----> 1 'string' - 'other string'

TypeError: unsupported operand type(s) for -: 'str' and 'str'

您需要相互减去日期时间对象,然后将timedelta对象转换为字符串。例如:

a = datetime.datetime.now()
dataset['DaysUntilSub'] = dataset['Renewed_subscription'].apply(lambda x: (x - a).days, axis=1)

这假定您的续订订阅&#39;已经是一个日期时间对象。数据框中的结果列将是天数的整数值。

答案 3 :(得分:0)

我最后采用的解决方案,感谢@titipat,是:

import dataset

dataset['DaysUntilSub'] = dataset['Renewed_subscription'].map(
    lambda x: (x - datetime.today()).days)