【问题标题】:cannot add the type DateOffset to a TimedeltaArray无法将 DateOffset 类型添加到 TimedeltaArray
【发布时间】:2021-10-26 14:43:07
【问题描述】:

假设数据框 (df) 由 3 列组成。

V1  V2              V3
1   0 days 23:09:00 0 days 23:34:00
1   0 days 23:36:00 1 days 00:03:00
1   1 days 00:06:00 1 days 00:29:00
1   1 days 00:31:00 1 days 00:57:00
2   0 days 22:40:00 0 days 23:04:00
2   0 days 23:09:00 0 days 23:35:00
2   0 days 23:37:00 1 days 00:01:00
2   1 days 00:06:00 1 days 00:30:00
2   1 days 00:33:00 1 days 00:56:00
3   0 days 22:50:00 0 days 23:21:09
3   0 days 23:38:56 1 days 00:09:00
3   1 days 00:12:00 1 days 00:42:09

我使用了以下代码:

df['V4']=(df.groupby('V1')['V3'] - df.groupby('V1')['V2'].shift(1)).astype('timedelta64[m]')

本质上,我想对 V1 中的每个唯一值执行操作,结果应如下所示:

V1  V2              V3              V4
1   0 days 23:09:00 0 days 23:34:00 NaN
1   0 days 23:36:00 1 days 00:03:00 54
1   1 days 00:06:00 1 days 00:29:00 53
1   1 days 00:31:00 1 days 00:57:00 51
2   0 days 22:40:00 0 days 23:04:00 NaN
2   0 days 23:09:00 0 days 23:35:00 55
2   0 days 23:37:00 1 days 00:01:00 52
2   1 days 00:06:00 1 days 00:30:00 53
2   1 days 00:33:00 1 days 00:56:00 50
3   0 days 22:50:00 0 days 23:21:09 NaN
3   0 days 23:38:56 1 days 00:09:00 79
3   1 days 00:12:00 1 days 00:42:09 63

收到错误:

无法在 TimedeltaArray 中添加/减去非刻度 DateOffset

数据类型:

{'V1': {1: 1, 2: 2, 3: 3}, 'V2': {0: Timedelta('0 days 23:09:00'), 1: Timedelta('0 days 23:36:00')}, 'V3': {0: Timedelta('0 days 23:34:00'), 1: Timedelta('1 days 00:03:00')}, 'V4': {0: 54, 1: 53}}

【问题讨论】:

  • 提供了样本df。
  • 您提供的代码没有给出您在示例中使用的df。能不能把原来的df加进去之前你对它做任何操作?
  • 它的 GTFS 数据。那么我如何证明 GTFS 数据呢?
  • 我已经提供了数据框。不确定这是否是您要求的
  • 它在代码中。它的减法

标签: python pandas datetime timedelta


【解决方案1】:

试试这个:

  1. 对所有行进行减法
  2. V1有变化时设置为NaN
df = df.sort_values(["V1", "V2", "V3"])
df["V4"] = (df["V3"]-df["V2"].shift()).dt.seconds//60
df["V4"] = df["V4"].where(df["V1"]==df["V1"].shift())

>>> df
    V1              V2              V3    V4
0    1 0 days 23:09:00 0 days 23:34:00   NaN
1    1 0 days 23:36:00 1 days 00:03:00  54.0
2    1 1 days 00:06:00 1 days 00:29:00  53.0
3    1 1 days 00:31:00 1 days 00:57:00  51.0
4    2 0 days 22:40:00 0 days 23:04:00   NaN
5    2 0 days 23:09:00 0 days 23:35:00  55.0
6    2 0 days 23:37:00 1 days 00:01:00  52.0
7    2 1 days 00:06:00 1 days 00:30:00  53.0
8    2 1 days 00:33:00 1 days 00:56:00  50.0
9    3 0 days 22:50:00 0 days 23:21:09   NaN
10   3 0 days 23:38:56 1 days 00:09:00  79.0
11   3 1 days 00:12:00 1 days 00:42:09  63.0

如果你想使用groupby:

df["V4"] = df.groupby("V1").apply(lambda x: (x["V3"]-x["V2"].shift()).dt.seconds//60).reset_index(drop=True)

>>> df
    V1              V2              V3    V4
0    1 0 days 23:09:00 0 days 23:34:00   NaN
1    1 0 days 23:36:00 1 days 00:03:00  54.0
2    1 1 days 00:06:00 1 days 00:29:00  53.0
3    1 1 days 00:31:00 1 days 00:57:00  51.0
4    2 0 days 22:40:00 0 days 23:04:00   NaN
5    2 0 days 23:09:00 0 days 23:35:00  55.0
6    2 0 days 23:37:00 1 days 00:01:00  52.0
7    2 1 days 00:06:00 1 days 00:30:00  53.0
8    2 1 days 00:33:00 1 days 00:56:00  50.0
9    3 0 days 22:50:00 0 days 23:21:09   NaN
10   3 0 days 23:38:56 1 days 00:09:00  79.0
11   3 1 days 00:12:00 1 days 00:42:09  63.0
输入:
df = pd.DataFrame({"V1": [1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3],
                   "V2": [pd.Timedelta("0 days 23:09:00"), pd.Timedelta("0 days 23:36:00"), pd.Timedelta("1 days 00:06:00"), pd.Timedelta("1 days 00:31:00"),
                          pd.Timedelta("0 days 22:40:00"), pd.Timedelta("0 days 23:09:00"), pd.Timedelta("0 days 23:37:00"), pd.Timedelta("1 days 00:06:00"),
                          pd.Timedelta("1 days 00:33:00"), pd.Timedelta("0 days 22:50:00"), pd.Timedelta("0 days 23:38:56"), pd.Timedelta("1 days 00:12:00")],
                   "V3":[pd.Timedelta("0 days 23:34:00"), pd.Timedelta("1 days 00:03:00"), pd.Timedelta("1 days 00:29:00"), pd.Timedelta("1 days 00:57:00"),
                         pd.Timedelta("0 days 23:04:00"), pd.Timedelta("0 days 23:35:00"), pd.Timedelta("1 days 00:01:00"), pd.Timedelta("1 days 00:30:00"),
                         pd.Timedelta("1 days 00:56:00"), pd.Timedelta("0 days 23:21:09"), pd.Timedelta("1 days 00:09:00"), pd.Timedelta("1 days 00:42:09")]
                   })

>>> df
    V1              V2              V3
0    1 0 days 23:09:00 0 days 23:34:00
1    1 0 days 23:36:00 1 days 00:03:00
2    1 1 days 00:06:00 1 days 00:29:00
3    1 1 days 00:31:00 1 days 00:57:00
4    2 0 days 22:40:00 0 days 23:04:00
5    2 0 days 23:09:00 0 days 23:35:00
6    2 0 days 23:37:00 1 days 00:01:00
7    2 1 days 00:06:00 1 days 00:30:00
8    2 1 days 00:33:00 1 days 00:56:00
9    3 0 days 22:50:00 0 days 23:21:09
10   3 0 days 23:38:56 1 days 00:09:00
11   3 1 days 00:12:00 1 days 00:42:09

【讨论】:

  • 我没有得到相同的结果。我的 V4 值不匹配。我得到的值> 1000。我不确定我的单位是否正确
  • 我使用了您问题中的数据。它适用于此。如果它不适用于您的数据,则说明您的示例不够具有代表性。您应该包括您获得意外值的数据/行。
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 2018-11-03
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
相关资源
最近更新 更多