您好,我正在尝试在时间序列数据上生成一个标志,以识别该事件的+ -3个时间段内的观测值。每个地方的活动日期可能有所不同。不确定如何在大熊猫中接近。任何建议都将受到欢迎。
熊猫:时间序列中的事件标记 输出:print(df.sort_values('ID'))
•
问答
song8615428 回答:熊猫:时间序列中的事件标记 输出:print(df.sort_values('ID'))
让我们尝试一下:
content\bin
输出:
content\API\bin
,
我们可以使用pd.merge_asof
将最接近的事件“日期”带到每个“位置”中的每一行。我使用np.select
来正确设置您的Flag列,因为它遵循一些奇怪的逻辑。
如果窗口重叠,则可以更改conds
和choices
中的顺序,以赋予一个优先于另一个的优先级,而无需检查其他任何逻辑。
import pandas as pd
import numpy as np
df['Date'] = pd.to_datetime(df.Date)
# Bring closest event date to `df`. Sort ruins order,but can fix later.
df = pd.merge_asof(df.sort_values('Date'),(df.loc[df.Event.eq(1),['Place','Date']]
.sort_values('Date')
.rename(columns={'Date': 'Date_2'})),by='Place',direction='nearest',left_on='Date',right_on='Date_2')
# Find day difference,needs to be adjusted in subsequent steps
df['Flag'] = (df['Date'] - df['Date_2']).dt.days
# Fix Flag to be desired final value.
conds = [df.Flag.ge(-3) & df.Flag.lt(0),df.Flag.ge(0) & df.Flag.le(3)]
choices = [df.Flag,df.Flag+1]
df['Flag'] = np.select(conds,choices,default=0)
输出:print(df.sort_values('ID'))
ID Place Date Event Date_2 Flag
0 1 A 2019-01-01 0 2019-01-06 0
2 2 A 2019-01-02 0 2019-01-06 0
4 3 A 2019-01-03 0 2019-01-06 -3
6 4 A 2019-01-04 0 2019-01-06 -2
8 5 A 2019-01-05 0 2019-01-06 -1
10 6 A 2019-01-06 1 2019-01-06 1
12 7 A 2019-01-07 0 2019-01-06 2
15 8 A 2019-01-08 0 2019-01-06 3
17 9 A 2019-01-09 0 2019-01-06 4
18 10 A 2019-01-10 0 2019-01-06 0
1 11 B 2019-01-01 0 2019-01-04 -3
3 12 B 2019-01-02 0 2019-01-04 -2
5 13 B 2019-01-03 0 2019-01-04 -1
7 14 B 2019-01-04 1 2019-01-04 1
9 15 B 2019-01-05 0 2019-01-04 2
11 16 B 2019-01-06 0 2019-01-04 3
13 17 B 2019-01-07 0 2019-01-04 4
14 18 B 2019-01-08 0 2019-01-04 0
16 19 B 2019-01-09 0 2019-01-04 0
19 20 B 2019-01-10 0 2019-01-04 0