GVKun编程网logo

如何在Python中将datetime.timedelta转换为分钟和小时?(python datetime转time)

13

这篇文章主要围绕如何在Python中将datetime.timedelta转换为分钟和小时?和pythondatetime转time展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在Pytho

这篇文章主要围绕如何在Python中将datetime.timedelta转换为分钟和小时?python datetime转time展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何在Python中将datetime.timedelta转换为分钟和小时?的优缺点,解答python datetime转time的相关问题,同时也会为您带来python datetime.timedelta进入列表、python – datetime和timedelta、python – 从Datetime操作创建TimeDeltas的pandas错误、python – 如何将字符串转换为datetime.timedelta()?的实用方法。

本文目录一览:

如何在Python中将datetime.timedelta转换为分钟和小时?(python datetime转time)

如何在Python中将datetime.timedelta转换为分钟和小时?(python datetime转time)

如何解决如何在Python中将datetime.timedelta转换为分钟和小时??

没有用于timedelta对象的内置格式化程序,但是你自己可以很容易地做到这一点:

days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

或者,等效地,如果你使用的是Python 2.7+或3.2+:

seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

现在,你可以根据需要打印它:

''{} minutes, {} hours''.format(minutes, hours)

例如:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = days * 24 + seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return hours, minutes, seconds
td = datetime.timedelta(2, 7743, 12345)
hours, minutes, seconds = convert_timedelta(td)
print ''{} minutes, {} hours''.format(minutes, hours)

这将打印:

9 minutes, 50 hours

如果要获取“ 10分钟1小时”而不是“ 10分钟1小时”,则也需要手动执行此操作:

print ''{} minute{}, {} hour{}''.format(minutes, ''s'' if minutes != 1 else '''',
                                      hours, ''s'' if minutes != 1 else '''')

或者,你可能想编写一个english_plural函数’s’为你完成这些操作,而不是重复自己。

从你的评论看来,你实际上是想让日子分开。这甚至更容易:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return days, hours, minutes, seconds

如果要将其转换为单个值以存储在数据库中,然后将该单个值转换回以对其进行格式化,请执行以下操作:

def dhms_to_seconds(days, hours, minutes, seconds):
    return (((days * 24) + hours) * 60 + minutes) * 60 + seconds

def seconds_to_dhms(seconds):
    days = seconds // (3600 * 24)
    hours = (seconds // 3600) % 24
    minutes = (seconds // 60) % 60
    seconds = seconds % 60
    return days, hours, minutes, seconds

因此,将其放在一起:

def store_timedelta_in_database(thingy, duration):
    seconds = dhms_to_seconds(*convert_timedelta(duration))
    db.execute(''INSERT INTO foo (thingy, duration) VALUES (?, ?)'',
               thingy, seconds)
    db.commit()

def print_timedelta_from_database(thingy):
    cur = db.execute(''SELECT duration FROM foo WHERE thingy = ?'', thingy)
    seconds = int(cur.fetchone()[0])
    days, hours, minutes, seconds = seconds_to_dhms(seconds)
    print ''{} took {} minutes, {} hours, {} days''.format(thingy, minutes, hours, days)

解决方法

我得到这样的开始日期:

from django.utils.timezone import utc
import datetime

start_date = datetime.datetime.utcnow().replace(tzinfo=utc)
end_date = datetime.datetime.utcnow().replace(tzinfo=utc)
duration = end_date - start_date

我得到这样的输出:

datetime.timedelta(0,5,41038)

如何将其转换为正常时间,如下所示?

10分钟1个小时是这样的

python datetime.timedelta进入列表

python datetime.timedelta进入列表

就像我在评论中写道的那样,您必须转换datetime.timedelta对象:

import datetime

new_time = datetime.time(minute=7)
print(new_time)
# >> 00:07:00
print(type(new_time))
# >> <class 'datetime.time'>

new_time_list: list = [new_time]
print(new_time_list)
# >> ['00:07:00']
print(type(new_time_list[0]))
# >> <class 'datetime.time'>

new_time_list: list = [str(new_time)]
print(new_time_list)
# >> ['00:07:00']
print(type(new_time_list[0]))
# >> <class 'str'>

new_time_list = [new_time.isoformat()]
print(new_time_list)
# >> ['00:07:00']
print(type(new_time_list[0]))
# >> <class 'str'>

输入您的代码

from datetime import datetime

list_dt_obj: list  = []
list_str: list = []
date_now = datetime.now()
now = date_now.strftime("%H:%M")
timeB = datetime.strptime(now,"%H:%M")

temps_arret_aller = ["00:00","00:07","00:14","00:21"]

for temp in temps_arret_aller:
    timeA = datetime.strptime(temp,"%H:%M")

    newTime = timeA - timeB

    print(newTime)  # print datetime.timedelta obj: output as string
    list_dt_obj.append(newTime) # add datetime.timedelta obj
    list_str.append(str(newTime))  # toString

print(list_dt_obj)  # list of datetime.timedelta obj
print(list_str)  # list of strings

# output:
# -1 day,10:19:00
# -1 day,10:26:00
# -1 day,10:33:00
# -1 day,10:40:00
# [datetime.timedelta(-1,37140),datetime.timedelta(-1,37560),37980),38400)]
# ['-1 day,10:19:00','-1 day,10:26:00',10:33:00',10:40:00']
,

打印项目时,将在该项目上调用.__str__()。当您打印容器时,.__repr__()会在容器中的每个项目上被调用。

import datetime

time_delta = datetime.timedelta(seconds=1000)
print(time_delta)  # 0:16:40
print(time_delta.__str__())  # 0:16:40
print(time_delta.__repr__())  # datetime.timedelta(seconds=1000)

my_list = [time_delta,time_delta]
print(my_list)  # [datetime.timedelta(seconds=1000),datetime.timedelta(seconds=1000)]
print([str(delta) for delta in my_list])  # ['0:16:40','0:16:40']

从最后一行可以看到,您可以手动调用容器中每个项目的str()来获取所需的内容。

python – datetime和timedelta

python – datetime和timedelta

我的时区是UTC 5.

所以,当我做datetime.datetime.Now()时,它给出:

2012-07-14 06:11:47.318000
#note its 6AM

我想从它减去5个小时,以便它等于datetime.datetime.utcNow()所以我做了:

import time
from datetime import datetime,timedelta
dt = datetime.Now() - timedelta(hours=time.timezone/60/60)
print dt
#gives 2012-07-14 11:11:47.319000

"""
Here 11 is not the PM its AM i double check it by doing
print dt.strftime('%H:%M:%s %p')
#gives 11:11:47 AM
"""

你看到它不是减去5小时而是在日期时间增加5小时?
我在这里做错了吗?

最佳答案
你正在创造一个负时间. time.timezone的值为负数:

>>> import time
>>> time.timezone
-36000

在这里,我是UTC 10,所以你的代码变成了:

>>> from datetime import timedelta
>>> print timedelta(hours=time.timezone/60/60)
-1 day,14:00:00

python – 从Datetime操作创建TimeDeltas的pandas错误

python – 从Datetime操作创建TimeDeltas的pandas错误

我已经查看了其他几个相关问题 here,here和 here,但没有一个问题和我有过相同的问题.

我正在使用Pandas版本0.16.2.我在Pandas数据帧中有几个列,dtype为datetime64 [ns]:

In [6]: date_list = ["SubmittedDate","PolicyStartDate","PaidUpDate","maturityDate","DraftDate","CurrentValuationDate","dob","InForceDate"]

In [11]: data[date_list].head()

Out[11]:
      SubmittedDate PolicyStartDate PaidUpDate maturityDate DraftDate  \
    0           NaT      2002-11-18        NaT   2041-03-04       NaT
    1           NaT      2015-01-13        NaT          NaT       NaT
    2           NaT      2014-10-15        NaT          NaT       NaT
    3           NaT      2009-08-27        NaT          NaT       NaT
    4           NaT      2007-04-19        NaT   2013-10-01       NaT

      CurrentValuationDate        dob InForceDate
    0           2015-04-30 1976-03-04  2002-11-18
    1                  NaT 1949-09-27  2015-01-13
    2                  NaT 1947-06-15  2014-10-15
    3           2015-07-30 1960-06-07  2009-08-27
    4           2010-04-21 1950-10-01  2007-04-19

这些最初是字符串格式(例如’1976-03-04′),我使用以下方法转换为datetime对象:

In [7]: for datecol in date_list:
   ...:         data[datecol] = pd.to_datetime(data[datecol],coerce=True,errors = ''raise'')

以下是每个列的dtypes:

In [8]: for datecol in date_list:
              print data[datecol].dtypes

收益:

datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]
datetime64[ns]

到现在为止还挺好.但我想要做的是为每个列创建一个新列,从特定日期开始提供以天为单位的年龄(作为整数).

In [13]: current_date = pd.to_datetime("2015-07-31")

我第一次跑这个:

In [14]: for i in date_list:
   ....:         data[i+"InDays"] = data[i].apply(lambda x: current_date - x)

但是,当我检查返回列的dtype时:

In [15]: for datecol in date_list:
   ....:         print data[datecol + "InDays"].dtypes

我得到这些:

object
timedelta64[ns]
object
timedelta64[ns]
object
timedelta64[ns]
timedelta64[ns]
timedelta64[ns]

我不知道为什么他们三个是对象,什么时候应该是timedeltas.我接下来要做的是:

In [16]: for i in date_list:
   ....:         data[i+"InDays"] = data[i+"InDays"].dt.days

这种方法适用于timedelta列.但是,由于其中三列不是timedeltas,我收到此错误:

AttributeError: Can only use .dt accessor with datetimelike values

我怀疑这三列中有一些值阻止​​Pandas将它们转换为timedeltas.我无法弄清楚如何弄清楚这些价值观可能是什么.

解决方法

出现此问题是因为您有三个只有NaT值的列,这会导致在您对其应用条件时将这些列视为对象.

您应该在应用部分中添加某种条件,以便在NaT情况下默认为某个时间点.示例 –

for i in date_list:
    data[i+"InDays"] = data[i].apply(lambda x: current_date - x if x is not pd.NaT else pd.timedelta(0))

或者,如果您不能执行上述操作,则应将条件设置为您想要执行的操作 – data [i“InDays”] = data [i“InDays”].dt.days,仅当系列的dtype允许时才接受它它.

或者更简单的方法来更改应用部分以直接获得您想要的 –

for i in date_list:
    data[i+"InDays"] = data[i].apply(lambda x: (current_date - x).days if x is not pd.NaT else x)

这会输出 –

In [110]: data
Out[110]:
  SubmittedDate PolicyStartDate PaidUpDate maturityDate DraftDate  \
0           NaT      2002-11-18        NaT   2041-03-04       NaT
1           NaT      2015-01-13        NaT          NaT       NaT
2           NaT      2014-10-15        NaT          NaT       NaT
3           NaT      2009-08-27        NaT          NaT       NaT
4           NaT      2007-04-19        NaT   2013-10-01       NaT

  CurrentValuationDate        dob InForceDate SubmittedDateInDays  \
0           2015-04-30 1976-03-04  2002-11-18                 NaT
1                  NaT 1949-09-27  2015-01-13                 NaT
2                  NaT 1947-06-15  2014-10-15                 NaT
3           2015-07-30 1960-06-07  2009-08-27                 NaT
4           2010-04-21 1950-10-01  2007-04-19                 NaT

   PolicyStartDateInDays PaidUpDateInDays maturityDateInDays DraftDateInDays  \
0                   4638              NaT              -9348             NaT
1                    199              NaT                NaN             NaT
2                    289              NaT                NaN             NaT
3                   2164              NaT                NaN             NaT
4                   3025              NaT                668             NaT

  CurrentValuationDateInDays  dobInDays  InForceDateInDays
0                         92      14393               4638
1                        NaN      24048                199
2                        NaN      24883                289
3                          1      20142               2164
4                       1927      23679               3025

如果您想将NaT更改为NaN,您可以使用 –

for i in date_list:
    data[i+"InDays"] = data[i].apply(lambda x: (current_date - x).days if x is not pd.NaT else np.NaN)

示例/演示 –

In [114]: for i in date_list:
   .....:     data[i+"InDays"] = data[i].apply(lambda x: (current_date - x).days if x is not pd.NaT else np.NaN)
   .....:

In [115]: data
Out[115]:
  SubmittedDate PolicyStartDate PaidUpDate maturityDate DraftDate  \
0           NaT      2002-11-18        NaT   2041-03-04       NaT
1           NaT      2015-01-13        NaT          NaT       NaT
2           NaT      2014-10-15        NaT          NaT       NaT
3           NaT      2009-08-27        NaT          NaT       NaT
4           NaT      2007-04-19        NaT   2013-10-01       NaT

  CurrentValuationDate        dob InForceDate  SubmittedDateInDays  \
0           2015-04-30 1976-03-04  2002-11-18                  NaN
1                  NaT 1949-09-27  2015-01-13                  NaN
2                  NaT 1947-06-15  2014-10-15                  NaN
3           2015-07-30 1960-06-07  2009-08-27                  NaN
4           2010-04-21 1950-10-01  2007-04-19                  NaN

   PolicyStartDateInDays  PaidUpDateInDays  maturityDateInDays  \
0                   4638               NaN               -9348
1                    199               NaN                 NaN
2                    289               NaN                 NaN
3                   2164               NaN                 NaN
4                   3025               NaN                 668

   DraftDateInDays  CurrentValuationDateInDays  dobInDays  InForceDateInDays
0              NaN                          92      14393               4638
1              NaN                         NaN      24048                199
2              NaN                         NaN      24883                289
3              NaN                           1      20142               2164
4              NaN                        1927      23679               3025

python – 如何将字符串转换为datetime.timedelta()?

python – 如何将字符串转换为datetime.timedelta()?

如何在 python中将我的日期字符串转换为datetime.timedelta()?

我有这个代码:

import datetime

date_select = '2011-12-1'
delta = datetime.timedelta(days=1)
target_date = date_select + delta
print target_date

提前致谢 …

解决方法

您不会将date_select转换为timedelta,而是需要一个datetime对象,可以将其添加到timedelta以生成更新的datetime对象:
from datetime import datetime,timedelta

date_select = datetime.strptime('2011-12-1','%Y-%m-%d')
delta = timedelta(days=1)
target_date = date_select + delta
print target_date

或者,如果您愿意,不需要…导入…导入行:

import datetime    # <- LOOK HERE,same as in your example

date_select = datetime.datetime.strptime('2011-12-1','%Y-%m-%d')
delta = datetime.timedelta(days=1)
target_date = date_select + delta
print target_date

今天关于如何在Python中将datetime.timedelta转换为分钟和小时?python datetime转time的讲解已经结束,谢谢您的阅读,如果想了解更多关于python datetime.timedelta进入列表、python – datetime和timedelta、python – 从Datetime操作创建TimeDeltas的pandas错误、python – 如何将字符串转换为datetime.timedelta()?的相关知识,请在本站搜索。

本文标签: