gpt4 book ai didi

python - PANDAS TimeGrouper 具有用于下采样的个性化起点

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:13 27 4
gpt4 key购买 nike

TL:DR

我想按主题和 30 天时间段分组,但 30 天时间段并未按主题个性化。

处理此问题的最佳方法是什么?

完整解释

我有一个参与者样本,他们都在不同时间开始了一项科学研究。我想使用 TimeGrouper 在他们参与研究的第一天后每 30 天进行一次分割。

经过一些搜索,这似乎是不可能的,因为很难为 TimeGrouper 指定起点。因此,作为代理人,我可能会为每个人使用第一个观察到的时间戳。

为此,我尝试按参与者 ID 和 TimeGrouper 进行分组,但是这 30 天似乎是从全局最早的时间点开始计算的,而不是每个参与者的最早时间点。

我知道这有点复杂,所以这里有一些代码:

这是一个代表我正在使用的数据类型的假数据框:

fakedf = pd.DataFrame({'participantID':['subj1', 'subj1', 'subj1', 'subj1', 'subj2', 'subj2', 'subj2', 'subj2'], 
'timestamp':['2015-06-25 01:12:00', '2015-06-30 11:02:00', '2015-07-05 09:33:00', '2015-07-28 07:22:00',
'2015-07-25 01:11:00', '2015-07-31 11:02:00', '2015-08-07 09:33:00', '2015-08-10 07:22:00'], 'studystart':['2015-06-20 00:00:00', '2015-06-20 00:00:00', '2015-06-20 00:00:00', '2015-06-20 00:00:00',
'2015-07-25 00:00:00', '2015-07-25 00:00:00', '2015-07-25 00:00:00', '2015-07-25 00:00:00']})

fakedf.index = pd.to_datetime(fakedf.timestamp)

上面的代码应该创建这个数据框:

fake data frame

下面是我希望实际工作的代码:

fakedf.groupby(['participantID', pd.TimeGrouper(freq="30D",  closed='left')]).count()

这是输出:

enter image description here

您可以看到 subj1 和 subj2 从 2015 年 6 月 25 日开始它们的时间分组,尽管事实上 subj2 直到 2015 年 7 月 25 日才具有真正的时间戳。

如果我可以通过以下任一方式开始每 30 天的时间分组,我会很高兴:

a) 研究开始日期,或

b) 每个参与者的第一个时间戳

我有一个我知道可行的低技术解决方案,但我希望有一个漂亮、优雅的 TimeGrouper 解决方案。

提前致谢!

最佳答案

要让 TimeGrouper 处于参与者级别,首先在 'participantID' 上执行 groupby 然后在每个组中执行TimeGrouper 上的另一个 groupby。为了清楚起见,我将第二个 groupby 分离为一个单独的函数。

def inner_groupby(grp, key=None):
return grp.groupby(pd.TimeGrouper(key=key, freq='30D')).count()

fakedf.groupby('participantID').apply(inner_groupby)

结果输出:

                                   participantID  studystart  timestamp
participantID timestamp
subj1 2015-06-25 01:12:00 3 3 3
2015-07-25 01:12:00 1 1 1
subj2 2015-07-25 01:11:00 4 4 4

您不需要为 TimeGrouper 指定一个 key。默认情况下,我相信它会使用索引。但是,如果您希望 TimeGrouper 位于其他列之上,例如 'studystart',您可以通过 key 参数传递它:

fakedf.groupby('participantID').apply(inner_groupby, key='studystart')

key='studystart' 的结果输出:

                          participantID  timestamp
participantID studystart
subj1 2015-06-20 4 4
subj2 2015-07-25 4 4

关于python - PANDAS TimeGrouper 具有用于下采样的个性化起点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37954489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com