【问题标题】:Difference between two dates in PythonPython中两个日期之间的差异
【发布时间】:2012-01-15 05:09:44
【问题描述】:

我有两个不同的日期,我想知道它们之间的天数差异。日期格式为 YYYY-MM-DD。

我有一个函数可以在日期上加上或减去给定的数字:

def addonDays(a, x):
   ret = time.strftime("%Y-%m-%d",time.localtime(time.mktime(time.strptime(a,"%Y-%m-%d"))+x*3600*24+3600))      
   return ret

其中 A 是日期,x 是我要添加的天数。结果是另一个日期。

我需要一个函数,我可以在其中给出两个日期,结果将是一个以天为单位的日期差的 int。

【问题讨论】:

  • 请注意,您的 addonDays 函数将在 DST 日失败。
  • 你是对的。我已经修改了功能。如果添加 3600(一小时)就可以了。

标签: python date


【解决方案1】:

您可以使用第三方库dateutil,它是内置datetime的扩展。

使用parser 模块解析日期非常简单:

from dateutil import parser

date1 = parser.parse('2019-08-01')
date2 = parser.parse('2019-08-20')

diff = date2 - date1

print(diff)
print(diff.days)

根据this deleted duplicate的答案来回答

【讨论】:

    【解决方案2】:

    我尝试了一些代码,但最终使用了像(在 Python 3 中)这样简单的代码:

    from datetime import datetime
    df['difference_in_datetime'] = abs(df['end_datetime'] - df['start_datetime'])
    

    如果您的 start_datetimeend_datetime 列采用 datetime64[ns] 格式,datetime 会理解它并返回天数 + 时间戳的差异,即是timedelta64[ns] 格式。

    如果您只想查看 days 的差异,您可以仅分隔 start_datetimeend_datetime 的 date 部分 通过使用(也适用于 time 部分):

    df['start_date'] = df['start_datetime'].dt.date
    df['end_date'] = df['end_datetime'].dt.date
    

    然后运行:

    df['difference_in_days'] = abs(df['end_date'] - df['start_date'])
    

    【讨论】:

      【解决方案3】:

      pd.date_range('2019-01-01', '2019-02-01').shape[0]

      【讨论】:

      • 请以某种方式更正答案,以恢复投票的声誉。
      • 建议没有“熊猫”的东西
      【解决方案4】:

      试试这个:

      data=pd.read_csv('C:\Users\Desktop\Data Exploration.csv')
      data.head(5)
      first=data['1st Gift']
      last=data['Last Gift']
      maxi=data['Largest Gift']
      l_1=np.mean(first)-3*np.std(first)
      u_1=np.mean(first)+3*np.std(first)
      
      
      m=np.abs(data['1st Gift']-np.mean(data['1st Gift']))>3*np.std(data['1st Gift'])
      pd.value_counts(m)
      l=first[m]
      data.loc[:,'1st Gift'][m==True]=np.mean(data['1st Gift'])+3*np.std(data['1st Gift'])
      data['1st Gift'].head()
      
      
      
      
      m=np.abs(data['Last Gift']-np.mean(data['Last Gift']))>3*np.std(data['Last Gift'])
      pd.value_counts(m)
      l=last[m]
      data.loc[:,'Last Gift'][m==True]=np.mean(data['Last Gift'])+3*np.std(data['Last Gift'])
      data['Last Gift'].head()
      

      【讨论】:

        【解决方案5】:

        另一个简短的解决方案:

        from datetime import date
        
        def diff_dates(date1, date2):
            return abs(date2-date1).days
        
        def main():
            d1 = date(2013,1,1)
            d2 = date(2013,9,13)
            result1 = diff_dates(d2, d1)
            print '{} days between {} and {}'.format(result1, d1, d2)
            print ("Happy programmer's day!")
        
        main()
        

        【讨论】:

        • diff_dates函数中的if不是完全没有必要吗?根据绝对值的定义,abs(date1-date2) 将始终等于abs(date2-date1)
        • 至少在 Python3.5 中打印语句应该是这样的: print ('{} days between {} and {}'.format(result1, d1, d2))
        【解决方案6】:

        我尝试了上面 larsmans 发布的代码,但是有几个问题:

        1) 原样的代码会抛出 mauguerra 提到的错误 2)如果将代码更改为以下:

        ...
            d1 = d1.strftime("%Y-%m-%d")
            d2 = d2.strftime("%Y-%m-%d")
            return abs((d2 - d1).days)
        

        这会将您的日期时间对象转换为字符串,但是有两件事

        1) 尝试执行 d2 - d1 将失败,因为您不能对字符串使用减号运算符和 2)如果您阅读了上述答案的第一行,您想在两个日期时间对象上使用 - 运算符,但是您只是将它们转换为字符串

        我发现你实际上只需要以下内容:

        import datetime
        
        end_date = datetime.datetime.utcnow()
        start_date = end_date - datetime.timedelta(days=8)
        difference_in_days = abs((end_date - start_date).days)
        
        print difference_in_days
        

        【讨论】:

        • 我的代码使用datetime.strptime 将字符串转换为datetime 对象。由于 OP 声明“日期格式为 YYYY-MM-DD”,我假设日期表示为字符串。如果不是,显然不需要转换。
        【解决方案7】:

        使用- 获取两个datetime 对象之间的差异并获取days 成员。

        from datetime import datetime
        
        def days_between(d1, d2):
            d1 = datetime.strptime(d1, "%Y-%m-%d")
            d2 = datetime.strptime(d2, "%Y-%m-%d")
            return abs((d2 - d1).days)
        

        【讨论】:

        • 很好的答案。需要明确的是,(d2 - d1) 的结果将是一个 timedelta 对象。
        • 我在控制台出现这个错误:type object 'datetime.datetime' has no attribute 'strptime'
        • 我得到 TypeError: 'int' object is not callable when I try to do .days() on a timedelta object 并且文档也没有提及它(docs.python.org/2/library/datetime.html)。
        • 你能不能也提一下total_seconds?我认为这很重要,因为这是我在尝试seconds 而不阅读文档时所期望得到的。
        • @ThejKiran 让 d2 和 d1 正好分开一天,看看它是否符合您的预期;-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 2020-10-19
        • 2013-10-02
        • 2016-12-30
        相关资源
        最近更新 更多