我有一个大型 Dataframe ,需要一个值为0或1的新列sig
。
条件:
如果第3行中的data
〉第2行中的data
〉第1行中的data
,则从08:30开始在每天的第3行中添加值= 1,否则为0
限制条件:在原始 Dataframe 中,时间戳中的秒间隔是不相等的,所以你不能按时间间隔去做。每天的行数是不同的。
示例 Dataframe (我不知道如何随机化秒数,因此这里的间隔相等,行数也相等):
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 500)
np.random.seed(100)
dates = pd.date_range("2022.01.01", "2022.01.31", freq="s")
dates=dates[:-1]
df = pd.DataFrame({'date':dates,
'data':np.random.randint(low=0, high=100, size=len(dates)).tolist()})
df['_date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df = df.loc[(df._date.dt.hour == 8) & (df._date.dt.minute == 30) & ((df._date.dt.second >= 0) & (df._date.dt.second <= 10))].head(30)
df.drop(['_date'], axis=1, inplace=True)
data
date
2022-01-01 08:30:00 14
2022-01-01 08:30:01 27
2022-01-01 08:30:02 33
2022-01-01 08:30:03 77
2022-01-01 08:30:04 66
2022-01-01 08:30:05 60
2022-01-01 08:30:06 72
2022-01-01 08:30:07 21
2022-01-01 08:30:08 70
2022-01-01 08:30:09 60
2022-01-01 08:30:10 76
2022-01-02 08:30:00 13
2022-01-02 08:30:01 73
2022-01-02 08:30:02 71
2022-01-02 08:30:03 78
2022-01-02 08:30:04 50
2022-01-02 08:30:05 80
2022-01-02 08:30:06 48
2022-01-02 08:30:07 24
2022-01-02 08:30:08 29
2022-01-02 08:30:09 43
2022-01-02 08:30:10 75
2022-01-03 08:30:00 11
2022-01-03 08:30:01 52
如何做到这一点?
预期结果:
data sig
date
2022-01-01 08:30:00 14 0
2022-01-01 08:30:01 27 0
2022-01-01 08:30:02 33 1
2022-01-01 08:30:03 77 0
2022-01-01 08:30:04 66 0
2022-01-01 08:30:05 60 0
2022-01-01 08:30:06 72 0
2022-01-01 08:30:07 21 0
2022-01-01 08:30:08 70 0
2022-01-01 08:30:09 60 0
2022-01-01 08:30:10 76 0
2022-01-02 08:30:00 13 0
2022-01-02 08:30:01 73 0
2022-01-02 08:30:02 71 0
2022-01-02 08:30:03 78 0
2022-01-02 08:30:04 50 0
2022-01-02 08:30:05 80 0
2022-01-02 08:30:06 48 0
2022-01-02 08:30:07 24 0
2022-01-02 08:30:08 29 0
2022-01-02 08:30:09 43 0
2022-01-02 08:30:10 75 0
2022-01-03 08:30:00 11 0
2022-01-03 08:30:01 32 0
2022-01-03 08:30:02 52 1
2022-01-03 08:30:03 44 0
2022-01-03 08:30:03 75 0
1条答案
按热度按时间6za6bjd01#
我用您的代码创建了输入数据,但它看起来与您的打印版本有点不同:
您的规则可以被描述为一个3行的滚动窗口,检查窗口是否已排序(value3大于2大于1)。知道我们可以在整个数据上使用此条件(无需注意
date
),并创建一个值为1(如果条件为True)和0(如果条件为False)的系列(名为cond
)然后搜索每天的第3个值,并将cond
中该索引的值Map到新列。第一次
输出量: