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

Posted

技术标签:

【中文标题】减去两个日期时间以获得天数(python)【英文标题】:Subtract two datetime to get the number of days (python) 【发布时间】:2017-04-17 22:22:30 【问题描述】:

在过去的两天里,我一直在思考这个问题,我正处于放弃的边缘。

我有一个名为Renewed_subscription 的列,格式为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 dataset['DaysUntilSub'] = dataset.apply(lambda x: (pd.Timestamp.today().strftime('%Y-%m-%d') - str(dataset['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减少=真 -> 4152 返回self._apply_standard(f,轴,减少=减少) 4153 其他: 第4154章

C:\Users\katep\Anaconda3\lib\site-packages\pandas\core\frame.py in _apply_standard(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 例外为 e:

C:\Report.py in (x)

TypeError: ("unsupported operand type(s) for -: 'str' and 'str'", 'occured at index 42')

如果您能指出我的错误,我将不胜感激,因为我无法继续进行分析!

【问题讨论】:

你能读懂你自己的问题吗?!想象我们…… 对不起,我把问题格式化了。 【参考方案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)

【讨论】:

成功了!非常感谢!两天前,我意识到“没有人是一座孤岛”。亲爱的社区,你能推荐一些关于 lambda 的阅读吗?我认为我对运算符背后的逻辑缺乏了解。 lambda 是 Python 内置的内联函数(参见 secnetix.de/olli/Python/lambda_functions.hawk)。在这种情况下,它基本上将每一行数据帧作为输入lambda x: ,然后在冒号后返回输出(datetime.today() - x).days @Stephen,完成!我对地图功能也有疑问 - 是的,我就是那个业余爱好者。 @eponkratova,实际上你并不是那么业余,因为很多人会在这里发布一些东西,然后不会回复反馈,也不会对帮助过他们的人表示感谢。我相信如果你继续努力提出好的问题,并注意给出的反馈(确保你的格式很好),你会在 *** 上做得很好。祝你好运。 @Stepen,感谢 cmets 和编辑 :) 祝你好运@eponkratova【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

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

'字符串' - '其他字符串'

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'

您需要将 datetime 对象彼此相减,然后将 timedelta 对象转换为字符串。例如这样的:

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

这假定您的“Renewed_subscription”已经是一个日期时间对象。数据框中的结果列将是天数的整数值。

【讨论】:

【参考方案4】:

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

import dataset

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

【讨论】:

首先,如果@titipat 解决了您的问题,请考虑接受他在Help Center 中概述的答案。一旦你有足够的声誉,你也可能会赞成他的回答。其次,lambdas 可能是一个很难的概念。但它们只不过是一个带有一个参数的未命名函数。我在titipat 的答案末尾添加了更多内容,以展示如何使用命名函数完成完全相同的事情。希望他不会介意我编辑他的帖子....

以上是关于减去两个日期时间以获得天数(python)的主要内容,如果未能解决你的问题,请参考以下文章

如何减去两个angularjs日期变量

%b %d %Y 格式的两个日期之间的差异

如何用Python在指定日期上减去7天?

如何从/到日期减去/添加天数?

从日期中添加或减去天数的算法?

JavaScript怎么获得某一天的前一天日期