在 Pandas 中计算“times”行之间的差异

6

我的DataFrame的格式如下:

       TimeWeek   TimeSat  TimeHoli
0      6:40:00   8:00:00   8:00:00
1      6:45:00   8:05:00   8:05:00
2      6:50:00   8:09:00   8:10:00
3      6:55:00   8:11:00   8:14:00
4      6:58:00   8:13:00   8:17:00
5      7:40:00   8:15:00   8:21:00

我需要找到TimeWeek、TimeSat和TimeHoli中每行之间的时间差异,输出结果必须是:
TimeWeekDiff   TimeSatDiff  TimeHoliDiff
00:05:00          00:05:00       00:05:00
00:05:00          00:04:00       00:05:00
00:05:00          00:02:00       00:04:00  
00:03:00          00:02:00       00:03:00
00:02:00          00:02:00       00:04:00 

我尝试使用(d['TimeWeek']-df['TimeWeek'].shift().fillna(0),但出现了错误:
TypeError: unsupported operand type(s) for -: 'str' and 'str'

可能是因为该列中存在“:”的原因。我该怎么解决呢?
3个回答

6

看起来出现了错误,因为数据以字符串形式而不是时间戳形式存在。首先将它们转换为时间戳:

df2 = df.apply(lambda x: [pd.Timestamp(ts) for ts in x])

默认情况下,它们将包含今天的日期,但是一旦您对时间进行差异化处理(希望您不必担心跨日期差异23:55和00:05),这就不重要了。

转换后,只需对数据框进行差异化处理:

>>> df2 - df2.shift()
   TimeWeek  TimeSat  TimeHoli
0       NaT      NaT       NaT
1  00:05:00 00:05:00  00:05:00
2  00:05:00 00:04:00  00:05:00
3  00:05:00 00:02:00  00:04:00
4  00:03:00 00:02:00  00:03:00
5  00:42:00 00:02:00  00:04:00

根据您的需求,您可以只选择第1行及以上的行(忽略NaTs):

(df2 - df2.shift()).iloc[1:, :]

或者您可以用零填充 NaTs:
(df2 - df2.shift()).fillna(0)

2
忘记我刚才说的一切。Pandas有很好的时间差解析功能。
df["TimeWeek"] = pd.to_timedelta(df["TimeWeek"])
(d['TimeWeek']-df['TimeWeek'].shift().fillna(pd.to_timedelta("00:00:00"))

我尝试了这个,但出现了错误: raise ValueError("无法为[{0}]创建时间增量字符串转换器".format(r)) ValueError: 无法为[6:40:00]创建时间增量字符串转换器 - Pragnya Srinivasan
1
是的,看起来Pandas只能解析06:40:00,而不能解析6:40:00。稍微进行一些字符串操作就可以解决这个问题。在任何太短的值前加上0,然后再试一次。 - jwilner
这个问题现在已经在pandas主分支中修复,将会在0.16.1版本中发布。 - Andy Hayden

1
>>> import pandas as pd
>>> df = pd.DataFrame({'TimeWeek': ['6:40:00', '6:45:00', '6:50:00', '6:55:00', '7:40:00']})
>>> df["TimeWeek_date"] = pd.to_datetime(df["TimeWeek"], format="%H:%M:%S")
>>> print df
  TimeWeek       TimeWeek_date
0  6:40:00 1900-01-01 06:40:00
1  6:45:00 1900-01-01 06:45:00
2  6:50:00 1900-01-01 06:50:00
3  6:55:00 1900-01-01 06:55:00
4  7:40:00 1900-01-01 07:40:00
>>> df['TimeWeekDiff'] = (df['TimeWeek_date'] - df['TimeWeek_date'].shift().fillna(pd.to_datetime("00:00:00", format="%H:%M:%S")))
>>> print df
  TimeWeek       TimeWeek_date  TimeWeekDiff
0  6:40:00 1900-01-01 06:40:00      06:40:00
1  6:45:00 1900-01-01 06:45:00      00:05:00
2  6:50:00 1900-01-01 06:50:00      00:05:00
3  6:55:00 1900-01-01 06:55:00      00:05:00
4  7:40:00 1900-01-01 07:40:00      00:45:00

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