【问题标题】:Python: how to group pandas Data Frame in a certain time window?Python:如何在某个时间窗口内对熊猫数据框进行分组?
【发布时间】:2016-08-23 05:32:37
【问题描述】:

您好,我有一个数据框 df,其中包含从起点 X 到目的地 Y 的不同行程的数据,起始时间为 T。我想在某个时间窗口计算XY 之间的行程,比如说15 min。所以,

df:
X Y           T
1 2 2015-12-30 22:30:00.0
1 2 2015-12-30 22:35:00.0
1 2 2015-12-30 22:40:00.0
1 2 2015-12-30 23:40:00.0
3 5 2015-11-30 13:40:00.0
3 5 2015-11-30 13:44:00.0
3 5 2015-11-30 19:54:00.0

我想要

dfO:
X Y count
1 2   3
3 5   2

为了计算从XY 的所有行程,我做了:

tmp = df.groupby(["X", "Y"]).size()

我怎样才能考虑到我只想计算特定时间间隔内相同的行程dt这一事实?

【问题讨论】:

  • 在 groupby 之后的 T 列上使用 pd.diff。这样,您将在下一次旅行中获得差异。然后在dt部分上选择
  • 我在 groubpy 之后没有 T 列
  • 创建一个新函数,参数为dt。在那里,做 diff(在 T 上,应该在那里)并只选择 diff_T == dt 部分,返回选定的数据帧。然后做类似df.groupby(["X", "Y"]).apply(func)
  • @emax,不太清楚如何连接你想要的输出和to count trips between X and Y in a certain time windows, let say 15 min?你能发布想要的输出吗?
  • 在 group by 之前先过滤所有数据怎么样?

标签: python datetime pandas dataframe


【解决方案1】:

也许您正在寻找pd.TimeGrouper。它允许您按时间间隔对 DataFrame 中的行进行分组,前提是 DataFrame 具有 DatetimeIndex。 (请注意,MaxU's solution 展示了如何在不使用 DatetimeIndex 的情况下按时间间隔分组。)

import pandas as pd

df = pd.DataFrame({'T': ['2015-12-30 22:30:00.0',
                         '2015-12-30 22:35:00.0',
                         '2015-12-30 22:40:00.0',
                         '2015-12-30 23:40:00.0',
                         '2015-11-30 13:40:00.0',
                         '2015-11-30 13:44:00.0',
                         '2015-11-30 19:54:00.0'],
                   'X': [1, 1, 1, 1, 3, 3, 3],
                   'Y': [2, 2, 2, 2, 5, 5, 5]})
df['T'] = pd.to_datetime(df['T'])
df = df.set_index(['T'])
result = df.groupby([pd.TimeGrouper('15Min'), 'X', 'Y']).size()
print(result)

产量

T                    X  Y
2015-11-30 13:30:00  3  5    2
2015-11-30 19:45:00  3  5    1
2015-12-30 22:30:00  1  2    3
2015-12-30 23:30:00  1  2    1

这包含您想要的信息

T                    X  Y
2015-11-30 13:30:00  3  5    2
2015-12-30 22:30:00  1  2    3

等等。目前还不清楚您希望排除其他行的依据是什么。如果你 解释一下标准,我们应该能够准确地生成所需的DataFrame。

【讨论】:

  • @MaxU:我比我更喜欢你的回答。你能取消删除你的,这样我就可以删除我的了吗?
  • 当然,但请不要删除你的 ;) 我发誓我在写我的时候没有看到你的 :)
  • 这正是我想要的,但它给了我这个错误TypeError: axis must be a DatetimeIndex, but got an instance of 'Index'
  • @emax:听起来您的T 列包含日期字符串。它们需要转换为类似日期时间的值:df['T'] = pd.to_datetime(df['T']) 否则 pd.TimeGrouper 将无法将这些值识别为日期时间(或时间戳)。
【解决方案2】:

如果我理解正确:

In [34]: df.groupby([pd.Grouper(key='T', freq='15min'),'X','Y'], as_index=False).size()
Out[34]:
T                    X  Y
2015-11-30 13:30:00  3  5    2
2015-11-30 19:45:00  3  5    1
2015-12-30 22:30:00  1  2    3
2015-12-30 23:30:00  1  2    1

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 2015-12-23
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2022-01-25
    • 2017-10-15
    相关资源
    最近更新 更多