【问题标题】:How to add integer (seconds) to hh:mm:ss format in Python?如何在 Python 中将整数(秒)添加到 hh:mm:ss 格式?
【发布时间】:2017-08-03 20:51:27
【问题描述】:

我在 python 中有以下数据框,我试图通过将“持续时间”(以秒为单位)添加到“开始时间”来计算“新时间”列

Serial  start_date     start_time     Duration(seconds)  New time
    A   5/22/2017       10:37:24        216 
    A   5/22/2017       10:37:26        213 
    A   5/22/2017       10:37:29         3  
    A   5/22/2017       10:39:55         60 
    A   5/22/2017       10:51:50        380 
    A   5/22/2017       10:51:57        339 

我想在 start_time 中添加持续时间。持续时间以秒为单位。 'New time' 应为 hh:mm:ss 格式。

我尝试在论坛中寻找类似的查询,但无法解决这个问题。

下面是信息

data.info()

start_date         13661 non-null object
start_time         13661 non-null object
Duration           13661 non-null int64

我尝试使用 datetime 从论坛中的类似问题中得到提示

data.newtime = data.start_time + datetime.timedelta(data.Duration)

当我执行此操作时,出现以下错误:TypeError: timedelta days 组件不支持的类型:系列

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-95-fdfac1490ba5> in <module>()
----> 1 data.newtime = data.start_time + datetime.timedelta(data.Duration)

TypeError: unsupported type for timedelta days component: Series

不知道该怎么做。 python新手。

帮助表示赞赏 TIA

【问题讨论】:

  • @MaximilianPeters 我试着提到那个。在这里,我想为数据框中的每个行时间条目计算这个。我已经编辑了这个,出现了错误。
  • 谢谢!现在问题很清楚了。
  • 请注意,如果您在记录数据时执行此操作,那么闰秒(Python 会忽略)的存在可能会影响您的计算。通常只在物理实验和金融交易时间戳中很重要。

标签: python python-3.x pandas


【解决方案1】:

你可以使用to_timedelta,输出也是timedelta

df['New time'] = pd.to_timedelta(df['start_time']) + 
                 pd.to_timedelta(df['Duration(seconds)'], unit='s')
print (df)
  Serial start_date start_time  Duration(seconds) New time
0      A  5/22/2017   10:37:24                216 10:41:00
1      A  5/22/2017   10:37:26                213 10:40:59
2      A  5/22/2017   10:37:29                  3 10:37:32
3      A  5/22/2017   10:39:55                 60 10:40:55
4      A  5/22/2017   10:51:50                380 10:58:10
5      A  5/22/2017   10:51:57                339 10:57:36

但是如果秒数更多,输出就会改变,因为还有天数:

print (df)
  Serial start_date start_time  Duration(seconds)
0      A  5/22/2017   10:37:24                216
1      A  5/22/2017   10:37:26             213000
2      A  5/22/2017   10:37:29                  3
3      A  5/22/2017   10:39:55                 60
4      A  5/22/2017   10:51:50                380
5      A  5/22/2017   10:51:57                339

df['New time'] = pd.to_timedelta(df['start_time']) + 
                 pd.to_timedelta(df['Duration(seconds)'], unit='s')
print (df)
  Serial start_date start_time  Duration(seconds)        New time
0      A  5/22/2017   10:37:24                216 0 days 10:41:00
1      A  5/22/2017   10:37:26             213000 2 days 21:47:26
2      A  5/22/2017   10:37:29                  3 0 days 10:37:32
3      A  5/22/2017   10:39:55                 60 0 days 10:40:55
4      A  5/22/2017   10:51:50                380 0 days 10:58:10
5      A  5/22/2017   10:51:57                339 0 days 10:57:36

也可以添加日期时间:

df['New date'] = pd.to_datetime(df['start_date']) + \
                 pd.to_timedelta(df['start_time']) +  \
                 pd.to_timedelta(df['Duration(seconds)'], unit='s')
print (df)
  Serial start_date start_time  Duration(seconds)            New date
0      A  5/22/2017   10:37:24                216 2017-05-22 10:41:00
1      A  5/22/2017   10:37:26                213 2017-05-22 10:40:59
2      A  5/22/2017   10:37:29                  3 2017-05-22 10:37:32
3      A  5/22/2017   10:39:55                 60 2017-05-22 10:40:55
4      A  5/22/2017   10:51:50                380 2017-05-22 10:58:10
5      A  5/22/2017   10:51:57                339 2017-05-22 10:57:36

df['New date'] = pd.to_datetime(df['start_date']) + \
                 pd.to_timedelta(df['start_time']) +  \
                 pd.to_timedelta(df['Duration(seconds)'], unit='s')
print (df)
  Serial start_date start_time  Duration(seconds)            New date
0      A  5/22/2017   10:37:24                216 2017-05-22 10:41:00
1      A  5/22/2017   10:37:26             213000 2017-05-24 21:47:26
2      A  5/22/2017   10:37:29                  3 2017-05-22 10:37:32
3      A  5/22/2017   10:39:55                 60 2017-05-22 10:40:55
4      A  5/22/2017   10:51:50                380 2017-05-22 10:58:10
5      A  5/22/2017   10:51:57                339 2017-05-22 10:57:36

---

如果需要将timedelta 转换为string 格式为HH:MM:SS 并丢失days(如果存在):

df['New time'] = pd.to_timedelta(df['start_time']) + 
                 pd.to_timedelta(df['Duration(seconds)'], unit='s')
df['New time'] = pd.to_datetime(df['New time']).dt.strftime('%H:%M:%S')
print (df)
  Serial start_date start_time  Duration(seconds)  New time
0      A  5/22/2017   10:37:24                216  10:41:00
1      A  5/22/2017   10:37:26             213000  21:47:26
2      A  5/22/2017   10:37:29                  3  10:37:32
3      A  5/22/2017   10:39:55                 60  10:40:55
4      A  5/22/2017   10:51:50                380  10:58:10
5      A  5/22/2017   10:51:57                339  10:57:36

【讨论】:

  • 很高兴能帮上忙!美好的一天!
  • 获得我对各种选项的支持。又是一个好人!
【解决方案2】:

这里有一个sn-p,可以帮助你自己解决问题:

from datetime import datetime, timedelta

my_date = datetime.strptime('5/22/2017 10:37:24', '%m/%d/%Y %H:%M:%S')
my_time_diff = timedelta(seconds=216)
my_new_date = my_date + my_time_diff
print(my_new_date.strftime('%m/%d/%Y %H:%M:%S'))

有用的资源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 2019-10-28
    • 2012-02-20
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多