【问题标题】:Converting datetime to timedelta so they can be added将 datetime 转换为 timedelta 以便可以添加它们
【发布时间】:2015-03-23 22:05:19
【问题描述】:

当减去两个datetime对象时,我理解结果是timedelta对象:

import datetime

AcDepart = 1900-01-01 18:00:00
AcArrival = 1900-01-01 07:00:00
ActualHours = AcDepart - AcArrival 

然后我想从ActualHours 中减去另外两个date time 对象的总和

这是另外两个对象:

HrsEarly = 1900-01-01 02:00:00
HrsLate = 1900-01-01 00:30:00

这是无法完成的方程式:

UnCalcTime = ActualHours - (HrsEarly + HrsLate)

这是错误:

UnCalcTime = ActualHours - (HrsEarly + HrsLate)
TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'datetime.datetime'

所以,我显然不能添加datetime.datetime。有谁知道我怎么能解决这个问题? timedelta 可以加在一起吗?如果是这样,我如何将datetime 转换为timedelta

任何帮助将不胜感激,因为我长期以来一直试图解决这个问题,但没有成功。

【问题讨论】:

  • 可以从你的时间中减去“1900-01-01 00:00:00”来获得增量,但是那些HrsEarly首先来自哪里?它们不是HrsEarly,而是一个特定的时间点。另外,您的代码无效 python (AcDepart = 1900-01-01 18:00:00)

标签: python datetime timedelta


【解决方案1】:

最好的解决方案是首先将变量创建为timedelta

HrsEarly = datetime.timedelta(hours=2)
HrsLate = datetime.timedelta(minutes=30)

如果你不能这样做,你可以简单地从 datetime 对象中减去你的“零日期”。

>>> HrsEarly
datetime.datetime(1900, 1, 1, 2, 0)
>>> HrsEarly = HrsEarly - datetime.datetime(1900, 1, 1)
>>> HrsEarly
datetime.timedelta(0, 7200)

【讨论】:

  • 很好的答案。谁知道减去 datetime 对象会返回一个 timedelta 对象。这对我来说并不明显!谢谢!
【解决方案2】:

将字符串转换为时间增量

from datetime import datetime

AcDepart = '1900-01-01 18:00:00'
AcDepart_ = datetime.strptime(AcDepart, '%Y-%m-%d %H:%M:%S')
AcArrival = '1900-01-01 07:00:00'
AcArrival_ = datetime.strptime(AcArrival, '%Y-%m-%d %H:%M:%S')
ActualHours = (AcDepart_ - AcArrival_).total_seconds()/3600
print ActualHours

【讨论】:

    【解决方案3】:

    添加两个 datetime 对象是没有意义的:在您的示例中,“1900 年 1 月 1 日凌晨 2 点”加上“1900 年 1 月 1 日午夜半点”应该是“半点半” 1900 年 1 月 1 日两点”,但在另一种情况下,期望的结果很容易是“3800 年 2 月 2 日两点半”,或者甚至(如果使用 UNIX epoch 作为原点)“两点半1830 年 1 月 1 日”。

    看一个不同的例子可能会更明显:星期二 + 星期六的结果应该是什么?

    您的HrsEarlyHrsLate 变量可能是为了存储时间差异,并且有一个合适的类型:datetime.timedelta。将其中两个加在一起可以满足您的要求:

    >>> from datetime import timedelta
    >>> HrsEarly = timedelta(hours=2)
    >>> HrsLate = timedelta(minutes=30)
    >>> HrsTotal = (HrsEarly + HrsLate)
    >>> str(HrsTotal)
    '2:30:00'
    

    【讨论】:

      【解决方案4】:

      这个方法使用内置的timestamp函数怎么样?

      import datetime
      
      a = "2017-01-01 14:30:00"
      b = datetime.datetime.strptime(a, '%Y-%m-%d %H:%M:%S')
      c = b.timestamp()
      d = datetime.timedelta(seconds=c)
      

      运行时环境
      操作系统:Ubuntu 16.04
      Python 3.6

      【讨论】:

        【解决方案5】:

        创建modules.py 并粘贴以下两个函数。将它们导入到您想要的任何位置并按原样使用。

        import datetime
        
        def JsTimestampToPyDatetime(js_date):
            """
                converts javascript timestamp to python datetime taking care of 
                milliseconds and seconds
        
                Args:
                    js_date(Timestamp, required)
        
                Returns:
                    Datetime
            """
        
            try:
                # handles seconds
                date = datetime.datetime.fromtimestamp(int(js_date))
            except (ValueError):
                # handles miliseconds
                date = datetime.datetime.fromtimestamp(int(js_date) / 1000)
               
            return date
        
        # consuming javascript generated timestamps
        
        a = JsTimestampToPyDatetime(1627303810000) # with miliseconds
        b = JsTimestampToPyDatetime(1627476610) # with seconds only
        
        
        def GetDaysInDateTime(min_stamp, max_stamp):
            """
                Calculates time difference between two timestamps in days
        
                Args:
                    min_stamp(Datetime, required): Minimum/start datetime
                    max_stamp(Datetime, required): Maximum/end datetime
        
                Returns:
                    Int: Days
            """
        
            days = (max_stamp-min_stamp).days
            return int(days)
        
        
        print(GetDaysInDateTime(a, b))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-24
          • 1970-01-01
          • 2011-06-02
          • 1970-01-01
          • 2023-02-10
          • 2023-01-30
          • 2022-07-08
          • 1970-01-01
          相关资源
          最近更新 更多