我正在从弹性搜索中读取数据并将其转换为具有以下代码的 df:-
def elastic(domain):
client = Elasticsearch(['10.0.0.10:9200/'],timeout=600)
s = Search(using=client)
s = s.query({"constant_score" : {
"filter" : {
"bool" : {
"must" : [{
"range": {"@timestamp" : {
"gte": "now-7d",
"lte": "now"
}}
}],
"filter": [
{"term" :{"type" :"vx_clientevents"}}, # 1st filter, get all the data where type is "vx_apache_json"
{"term" :{"status_event" :"event"}}, # 2nd filter, get all the data where api is "viv_signin.php"
{"term" :{"domain":domain}}# 3rd filter, get all the data where domain is "fnwp"
]
}}}})
try:
df = pd.DataFrame((d.to_dict() for d in s.scan()))
df['time']=df['@timestamp']
df = df[['time', 'delta_count','status_event','ev']]
except:
df = pd.DataFrame()
return df
然后 AI 将数据重新采样为 15 分钟间隔;-
df = getdf("mt1cnp")
df = df.pivot_table(index='time', columns='status_event', values='delta_count', aggfunc='first', fill_value=0).rename_axis(columns=None).reset_index()
df["time"] = pd.to_datetime(df["time"])
df.set_index("time", inplace=True)
df = df.groupby(pd.Grouper(freq='15Min')).aggregate(np.sum)
df
所以在 7 天内,我们有 10080 分钟,当我以 15 分钟为间隔重新采样数据时,我应该有 672 次观察,但有时是 300、500 或 600,有时甚至只有一次观察甚至没有观察。< /p>
我想将缺失的时间戳数据点归为 0。如果弹性搜索的输出 df 只有一次观察或没有观察,那么我想为 0 甚至 15 分钟的时间戳。
答案 0 :(得分:0)
您的解决方案应创建 15 分钟的连续 DatetimeIndex,并为缺失的间隔添加 0
。
df = df.groupby(pd.Grouper(freq='15Min')).aggregate(np.sum)
替代方案是 DataFrame.resample
:
df = df.resample('15Min').sum()
如果没有,您可以添加DataFrame.asfreq
:
df = df.asfreq('15Min', fill_value=0)