python - 计算 DataFrame Pandas 中 'times' 行之间的差异

标签 python pandas row difference

我的 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'

可能是因为列中存在“:”。我该如何解决这个问题?

最佳答案

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

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

默认情况下它们将包含今天的日期,但是一旦您区分时间(希望您不必担心不同日期的 23:55 和 00:05 不同),这应该无关紧要。

转换后,只需区分 DataFrame:

>>> 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+ 行(忽略 NaT):

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

或者您可以用零填充 NaT:

(df2 - df2.shift()).fillna(0)

关于python - 计算 DataFrame Pandas 中 'times' 行之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29573441/

相关文章:

python - 如何将 graphviz (.dot) 文件上传到 Neo4j?

python - Tkinter 窗口直到循环完成后才更新

python - 何时在 Pandas 中使用 .count() 和 .value_counts()?

python - 用该列的平均值替换 Pandas 数据框中的列

python - 在 Pandas 中,如何根据另一列的值拆分一列?

php - 如何在 PHP 中从 Oracle 获取单行?

r - 如何将两行移动到 R 列表中数据框的顶部?

python - 从 2d numpy 数组中提取旋转的 1d 轮廓的结果不一致

python - pandas shift 不适用于列和行的子集

python - Pandas 数据框获取每组的第一行