【问题标题】:Turn a string back into a datetime timedelta将字符串转回日期时间 timedelta
【发布时间】:2017-11-20 13:16:22
【问题描述】:

我的 pandas 数据框中的一列代表我用 datetime 计算的时间增量,然后导出到 csv 并读回 pandas 数据框。现在列的 dtype 是 object 而我希望它是 timedelta 以便我可以在数据帧上执行 groupby 函数。下面是字符串的样子。谢谢!

  0 days 00:00:57.416000
  0 days 00:00:12.036000
  0 days 16:46:23.127000  
 49 days 00:09:30.813000  
 50 days 00:39:31.306000  
 55 days 12:39:32.269000
-1 days +22:03:05.256000

更新,我最好的尝试编写一个 for 循环来迭代我的 pandas 数据框中的特定列:

def delta(i):
    days, timestamp = i.split(" days ")
    timestamp = timestamp[:len(timestamp)-7]
    t = datetime.datetime.strptime(timestamp,"%H:%M:%S") + 
    datetime.timedelta(days=int(days))
    delta = datetime.timedelta(days=t.day, hours=t.hour, 
    minutes=t.minute, seconds=t.second)
    delta.total_seconds()

data['diff'].map(delta)

【问题讨论】:

  • 你想要以秒为单位的时间增量吗?
  • 理想情况下会是这样!

标签: python pandas datetime timedelta


【解决方案1】:

使用pd.to_timedelta

pd.to_timedelta(df.iloc[:, 0])

0     0 days 00:00:57.416000
1     0 days 00:00:12.036000
2     0 days 16:46:23.127000
3    49 days 00:09:30.813000
4    50 days 00:39:31.306000
5    55 days 12:39:32.269000
6   -1 days +22:03:05.256000
Name: 0, dtype: timedelta64[ns]

【讨论】:

  • 这个答案绝对是更好的答案。我不知道 pandas 有 to_timedelta 功能,好一个 PiRSquared
【解决方案2】:
import datetime

#Parse your string
days, timestamp = "55 days 12:39:32.269000".split(" days ")
timestamp = timestamp[:len(timestamp)-7]

#Generate datetime object
t = datetime.datetime.strptime(timestamp,"%H:%M:%S") + datetime.timedelta(days=int(days))

#Generate a timedelta
delta = datetime.timedelta(days=t.day, hours=t.hour, minutes=t.minute, seconds=t.second)

#Represent in Seconds
delta.total_seconds()

【讨论】:

  • 如何在 pandas 数据框中的特定列上进行迭代?谢谢-我发布了我的最佳尝试作为对我的问题的更新!也可以做成新的专栏……
  • @GrahamStreich 你应该使用map,看到这个stackoverflow.com/a/19798528/5496463
  • 谢谢你们。我创建了一个函数并使用 map 方法应用它,但是我遇到了另一个问题。某些时间以“+”或“-”号开头...我如何解释这些...我已经更新了我的问题中的数据以向您展示我的意思,并且我已经更新了代码向您展示我编写的函数以及我如何使用 map 方法。再次感谢!
【解决方案3】:

您可以这样做,循环遍历 CSV 中的每个值来代替 stringdate:

stringdate = "2 days 00:00:57.416000"
days_v_hms = string1.split('days')
hms = days_v_hms[1].split(':')
dt = datetime.timedelta(days=int(days_v_hms[0]), hours=int(hms[0]), minutes=int(hms[1]), seconds=float(hms[2]))

干杯!

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2019-04-12
    相关资源
    最近更新 更多