在熊猫数据框中为缺失的时间戳填充零

时间:2021-01-19 05:46:33

标签: python python-3.x pandas dataframe elasticsearch

我正在从弹性搜索中读取数据并将其转换为具有以下代码的 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

enter image description here

所以在 7 天内,我们有 10080 分钟,当我以 15 分钟为间隔重新采样数据时,我应该有 672 次观察,但有时是 300、500 或 600,有时甚至只有一次观察甚至没有观察。< /p>

我想将缺失的时间戳数据点归为 0。如果弹性搜索的输出 df 只有一次观察或没有观察,那么我想为 0 甚至 15 分钟的时间戳。

1 个答案:

答案 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)