将字符串转换为日期时间差值对象

6

我在pandas数据框中的一列表示一个时间差,我用datetime计算后导出到csv文件中,再读取回pandas数据框。现在这一列的dtype是对象,而我希望它是一个时间差,这样我就可以对数据框执行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)

你想要timedelta以秒为单位吗? - user1767754
理想情况下,它们应该是这样! - Graham Streich
翻译自英文至中文。仅返回翻译后的文本内容:类似:https://stackoverflow.com/q/21074100 - undefined
3个回答

5

使用 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]

1
这个答案绝对是更好的。我不知道pandas有to_timedelta函数,很棒PiRSquared。 - user1767754

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数据框中迭代特定列?谢谢 - 我已经在我的问题更新中发布了最佳尝试!它也可以制作成一个新的列.... - Graham Streich
1
@GrahamStreich 你应该使用 map,参见这里 https://dev59.com/R2Ij5IYBdhLWcg3w4Izt#19798528 - danche
谢谢你们两位。我编写了一个函数并使用map方法应用它,但是我遇到了另一个问题。有些小时数前面带有“+”或“-”号...我该如何处理这些符号...我已更新我的问题中的数据,以便向您展示我的意思,并更新了代码以向您展示我编写的函数和如何使用map方法。再次感谢! - Graham Streich

1
您可以这样做,循环遍历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]))

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接