缺失字段日期跨度统计
我需要统计数据中缺失字段的日期跨度,并统计缺失数据条数。有的字段是连续缺失,如表中当日最高温从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