gpt4 book ai didi

python - Pandas 时间序列事件之间的时间

转载 作者:太空狗 更新时间:2023-10-29 18:31:26 24 4
gpt4 key购买 nike

如何计算 Pandas 时间序列中“事件”之间的时间(天数)?例如,如果我有以下时间序列,我想知道该系列中的每一天自上次 TRUE

以来已经过去了多少天
            event
2010-01-01 False
2010-01-02 True
2010-01-03 False
2010-01-04 False
2010-01-05 True
2010-01-06 False

我完成它的方式似乎过于复杂,所以我希望有更优雅的东西。显然,遍历行的 for 循环是可行的,但我正在理想地寻找矢量化(可扩展)解决方案。我目前的尝试如下:

date_range = pd.date_range('2010-01-01', '2010-01-06')
df = pd.DataFrame([False, True, False, False, True, False], index=date_range, columns=['event'])
event_dates = df.index[df['event']]
df2 = pd.DataFrame(event_dates, index=event_dates, columns=['max_event_date'])
df = df.join(df2)
df['max_event_date'] = df['max_event_date'].cummax(axis=0, skipna=False)
df['days_since_event'] = df.index - df['max_event_date']

event max_event_date days_since_event
2010-01-01 False NaT NaT
2010-01-02 True 2010-01-02 0 days
2010-01-03 False 2010-01-02 1 days
2010-01-04 False 2010-01-02 2 days
2010-01-05 True 2010-01-05 0 days
2010-01-06 False 2010-01-05 1 days

最佳答案

继续改进这个答案,并希望有人采用“the”pythonic 方式。在那之前,我认为这个最终更新效果最好。

last = pd.to_datetime(np.nan)
def elapsed(row):
if not row.event:
return row.name - last
else:
global last
last = row.name
return row.name-last

df['elapsed'] = df.apply(elapsed,axis=1)

df
event elapsed
2010-01-01 False NaT
2010-01-02 True 0 days
2010-01-03 False 1 days
2010-01-04 False 2 days
2010-01-05 True 0 days
2010-01-06 False 1 days

::::::::::::::

在下面留下以前的答案,尽管它们不是最佳的

::::::::::

与其进行多次遍历,不如循环遍历索引似乎更容易

df['elapsed'] = 0
for i in df.index[1:]:
if not df['event'][i]:
df['elapsed'][i] = df['elapsed'][i-1] + 1

::::::::::::::

假设“Trues”是您感兴趣的事件。

trues = df[df.event==True]
trues.Dates = trues.index #need this because .diff() doesn't work on the index
trues.Elapsed = trues.Dates.diff()

关于python - Pandas 时间序列事件之间的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29091468/

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