Pandas计算连续行为日期跨度

缺失字段日期跨度统计

我需要统计数据中缺失字段的日期跨度,并统计缺失数据条数。有的字段是连续缺失,如表中当日最高温从2019-04-19至2019-04-30缺失了12条数据,需要统计出来。
在这里插入图片描述

方法一、Pandas分组聚合计数

参考https://cloud.tencent.com/developer/article/1856580,后来看了这种方法不满足我的场景。

import pandas as pd

data = pd.read_excel("缺失字段.xlsx")
t = data.loc[data["当日最高温"].isnull(), "dates"]
groupids = pd.to_datetime(data["dates"]) - pd.to_timedelta(data.dates.rank(), unit='d')
x = t.groupby(groupids).agg([
    ('dates', lambda x: f"{x.min()}~{x.max()}"),
    ("当日最高温", "count")
])
print(x.loc[:, x.columns.values[1:]])

输出结果:当日最高温缺失日期为2019-04-19~2022-10-24,缺失1285条数据
在这里插入图片描述

方法二、相邻两天字段比对

1、利用DataFrame.shift(1),构建某字段的shift列,判断列,辅助列。
2、若字段列和shift列相等,则判断列为0,否则为1。
3、计算辅助列的值:辅助列为判断列的累加和。

import pandas as pd
data = pd.read_excel("../青岛_住宿和餐饮业_.xlsx")
def missing_field_count(data:pd.DataFrame):
    data.set_index("date", inplace=True)
    missing_field = {}
    null_ratio = (data.isnull().sum() / data.shape[0]).map(lambda e: "{:.2%}".format(e))
    num_attrs_df = data.select_dtypes(include='number')
    zero_ratio = ((data[num_attrs_df.columns.values] <= 0).sum() / data.shape[0]).map(lambda e: "{:.2%}".format(e))
    null_ratio.name = "空值占比"
    zero_ratio.name = "零值占比"
    null_ratio.index.name = "字段"
    zero_ratio.index.name = "字段"
    for field in data.columns.values:
        df = pd.DataFrame()
        df[field] = data[field]
        df["shift"] = data[field].shift()
        df["jud"] = ~(pd.isnull(df["shift"]) == pd.isnull(data[field]))
        df["sup"] = df["jud"].cumsum()
        df = df.reset_index()
        df = df.loc[df[field].isnull(), :].groupby(by=["sup"]).date.agg(['count', 'min', 'max'])
        df = df.reset_index()
        df = df.drop(columns=["sup"])
        if not df.empty:
            missing_field[field] = df
    return null_ratio, zero_ratio, missing_field
g_cons = "total_bef_d_gas_cons"
null_ratio, zero_ratio, missing_field = missing_field_count(data)
pd.DataFrame(null_ratio)
pd.DataFrame(zero_ratio)
print(pd.DataFrame(missing_field["当日最低温"]))

输出结果为当日最高温在2019-06-20至2022-10-24缺失了1223条数据。
在这里插入图片描述
参考:
https://cloud.tencent.com/developer/article/1856580

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值