gpt4 book ai didi

python - 从其他数据框创建新的 Pandas 时间序列数据框

转载 作者:太空狗 更新时间:2023-10-30 03:00:48 25 4
gpt4 key购买 nike

我如何从一个现有的 df.dataframe 创建一个新的 pandas 时间序列数据框?

假设事件 A 于 11 月 28 日 11:35 开始并于 11 月 29 日 19:53 结束,这是计数 1。事件 A 的第二个实例再次于 11 月 28 日 11:37 开始并于 11 月 29 日 19:53 结束 - 计数另一个 1 . 所以我将 A 的值增加到 2。(抱歉,数据输入错误地是 11/28 而不是 11/29)

源 df 给出了事件的开始和结束时间。并且同一事件可以同时发生多次。新的 df 应该有给定分钟内事件累计计数的时间序列,范围从最小(开始时间)到最大(结束时间)。

来源 Df:

Start-Time       |  End-Time         | Event
11/28/2014 11:35 | 11/29/2014 19:53 | A
11/28/2014 11:36 | 11/28/2014 11:37 | B
11/28/2014 11:32 | 11/28/2014 19:53 | C
11/28/2014 11:37 | 11/28/2014 19:53 | A
......

新的 Df:

TimeStamp        | A |  B | C
11/28/2014 11:35 | 1 | 0 | 1
11/28/2014 11:36 | 1 | 1 | 1
11/28/2014 11:37 | 2 | 1 | 1
.....
11/29/2014 19:53 | 2 | 0 | 1

最佳答案

这有点棘手,因为您希望结束时间算作“开启”状态,但我认为这样的事情应该可行(警告:我在考虑奇怪的边缘情况时花费了零时间,所以买家要小心) :

df = pd.melt(df, id_vars="Event", var_name="Which", value_name="Time")
df["Signal"] = df.pop("Which").replace({"Start-Time": 1, "End-Time": -1})
pivoted = df.pivot(columns="Event", index="Time").fillna(0)
pivoted = pivoted.sort_index() # just in case; can't remember if this is guaranteed
df_out = pivoted.cumsum() + (pivoted == -1)

产生

>>> df_out
Signal
Event A B C
Time
11/28/2014 11:32 0 0 1
11/28/2014 11:35 1 0 1
11/28/2014 11:36 1 1 1
11/28/2014 11:37 2 1 1
11/28/2014 19:53 2 0 1
11/29/2014 19:53 1 0 0

基本思想是添加一个已签名的“信号”列并使用它来跟踪更改:

>>> df
Event Time Signal
0 A 11/28/2014 11:35 1
1 B 11/28/2014 11:36 1
2 C 11/28/2014 11:32 1
3 A 11/28/2014 11:37 1
4 A 11/29/2014 19:53 -1
5 B 11/28/2014 11:37 -1
6 C 11/28/2014 19:53 -1
7 A 11/28/2014 19:53 -1

然后我们可以旋转它来获得状态变化:

>>> pivoted
Signal
Event A B C
Time
11/28/2014 11:32 0 0 1
11/28/2014 11:35 1 0 0
11/28/2014 11:36 0 1 0
11/28/2014 11:37 1 -1 0
11/28/2014 19:53 -1 0 -1
11/29/2014 19:53 -1 0 0

并累加得到状态:

>>> pivoted.cumsum()
Signal
Event A B C
Time
11/28/2014 11:32 0 0 1
11/28/2014 11:35 1 0 1
11/28/2014 11:36 1 1 1
11/28/2014 11:37 2 0 1
11/28/2014 19:53 1 0 0
11/29/2014 19:53 0 0 0

这几乎是我们想要的,但您希望包括结束时间,因此我们可以通过撤消关闭来延迟效果:

>>> pivoted.cumsum() + (pivoted == -1)
Signal
Event A B C
Time
11/28/2014 11:32 0 0 1
11/28/2014 11:35 1 0 1
11/28/2014 11:36 1 1 1
11/28/2014 11:37 2 1 1
11/28/2014 19:53 2 0 1
11/29/2014 19:53 1 0 0

关于python - 从其他数据框创建新的 Pandas 时间序列数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27988847/

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