# A pandas 2 cleaning script, used to check the guard. Every marked line fails or silently changes in pandas 3.
import numpy as np
import pandas as pd

df = pd.read_csv("readings.txt", delim_whitespace=True)                       # delim-whitespace
df = pd.read_csv("readings.csv", parse_dates=["day"], date_parser=pd.to_datetime)  # date-parser
df = df.applymap(lambda v: v.strip() if isinstance(v, str) else v)            # applymap
df = df.fillna(method="ffill")                                                # fillna-method
df["reading"][0] = 0.0                                                        # chained-assignment
df["site"].fillna("unknown", inplace=True)                                    # inplace-on-column
hourly = df.set_index("day").resample("H").mean()                             # resample-alias
months = pd.date_range("2026-01-01", periods=12, freq="M")                    # freq-alias
codes = pd.to_numeric(df["code"], errors="ignore")                            # errors-ignore
more = df.append(df.tail(1))                                                  # append
text_cols = [c for c in df.columns if df[c].dtype == object]                  # object-dtype-check
totals = df.groupby("site").agg(np.sum)                                       # np-reduction-in-agg
