Reproducible Statistical Weighting in Python: A Developer’s Guide to Scaling Government Survey Estimates
pythondata pipelinestatistical methods

Reproducible Statistical Weighting in Python: A Developer’s Guide to Scaling Government Survey Estimates

DDaniel Mercer
2026-04-17
25 min read
Advertisement

Build reproducible, validated survey-weighting pipelines in Python for scalable government estimates.

Reproducible Statistical Weighting in Python: A Developer’s Guide to Scaling Government Survey Estimates

If you need to turn a small, messy survey sample into a defensible estimate for a real population, statistical weighting is the difference between “interesting results” and production-grade analytics. This guide walks through how data engineers can implement standard expansion estimation and stratified weights in Python, validate weighted Scotland-style estimates, and automate the full pipeline for recurring survey waves. Along the way, we’ll ground the discussion in the Business Insights and Conditions Survey (BICS) methodology, which is particularly useful because it shows what happens when unweighted survey outputs are not enough for regional inference. For teams building repeatable reporting pipelines, the core challenge is not just math; it’s reproducibility, validation, change control, and operational resilience, much like the themes in our guides on workflow automation for dev and IT teams and governing agents that act on live analytics data.

We’ll also look at why this problem is a lot closer to engineering a reliable data product than running a one-off analysis. The weighting logic needs tests, provenance, and a stable interface over time, especially when survey waves change or the source microdata schema evolves. If you’ve ever handled brittle connectors or changing upstream systems, the same lessons apply here; see our practical notes on developer SDK design patterns and technical rollout risk management.

1) What statistical weighting is actually doing

From sample counts to population estimates

At its simplest, statistical weighting rescales survey responses so the sample better reflects the population you want to describe. If a subgroup is underrepresented in the sample, its responses receive more influence; if a subgroup is overrepresented, its responses receive less. In expansion estimation, each sampled unit represents a known number of population units, and the weight is usually the inverse of the selection probability adjusted for nonresponse or calibration. For developers, the key point is that the weight is not a cosmetic multiplier; it is part of the estimator itself.

In government surveys, this is especially important because the sample design is rarely simple random sampling. Samples may be stratified by region, sector, or business size, and the survey may deliberately oversample some groups to reduce variance on important measures. That design improves measurement, but it means raw averages are often biased for population inference. This is why the Scottish Government’s weighted Scotland estimates for BICS matter: the same microdata can yield very different conclusions once weights are applied.

SRS, expansion, and why the baseline matters

When people say “weighted average,” they often skip the design context. Under simple random sampling (SRS), every unit has the same probability of selection, so the sample mean is unbiased in expectation. Under disproportionate stratified sampling, the SRS assumptions break, and a straight mean can misstate the population. Expansion estimation restores representativeness by inflating each respondent to the population count it stands in for, which is why a 200-response sample can produce estimates for a population of tens of thousands.

The practical engineering insight is that your pipeline should explicitly model the sampling frame, not just the response table. Keep strata definitions, population counts, and inclusion probabilities as versioned inputs. That way, when a new wave arrives, the estimator can be recomputed deterministically rather than inferred from a notebook. If you’re building around periodic refreshes, this is similar in spirit to how teams harden their operations in scale-for-spikes planning and financial reporting bottleneck analysis.

Why reproducibility is a first-class requirement

Reproducibility means you can rerun the exact same wave with the exact same inputs and get the same outputs. That sounds obvious, but in survey analytics it gets violated easily: filters change, response categories shift, missing data rules drift, and weights get recalculated with silent assumptions. A reproducible pipeline stores raw extracts, transformation code, control totals, and validation outputs together. It also captures wave metadata so later users know which questions were asked, which response universe was used, and whether the estimate is directly comparable to the previous wave.

For government survey estimates, trust depends on being able to explain every number. That requires more than a script; it requires an auditable data pipeline with checks, logs, and schema diffs. Think of it the same way you would treat a compliance-sensitive analytics system, not a throwaway spreadsheet. If your team already thinks in terms of traceability and permissions, the mindset overlaps with our guidance on AI governance for local agencies and risk-adjusting valuations for regulated tech.

2) How BICS-style Scotland estimates frame the problem

What the Scotland publication is doing

The Scottish Government’s BICS weighted estimates are a useful reference implementation because they take ONS microdata and produce Scotland-specific weighted estimates rather than relying on raw response counts. The methodology notes that the publication focuses on businesses with 10 or more employees, because the Scottish response base for smaller firms is too small to support suitable weighting. That is a strong example of design-aware estimation: you do not force a weighting scheme where the sample cannot support it.

This decision matters operationally. In a production pipeline, the correct response to a thin stratum is often not to extrapolate harder, but to narrow the supported universe, combine categories, or flag the estimate as unstable. Mature analytics systems do this all the time in other domains, whether they are forecasting or pricing. It’s the same discipline that informs robust approaches in ensemble forecasting and synthetic persona risk management.

Why unweighted outputs are insufficient for regional inference

BICS UK-level estimates may be weighted, but Scottish publications note that some Scottish outputs are unweighted and therefore only describe responders, not the wider Scottish business population. That distinction is critical. If large firms are more likely to respond, then unweighted percentages can overstate resilience, investment, or staffing changes depending on which groups are overrepresented. A weighted estimate attempts to correct that, but only if your weight construction is well grounded in the sampling design and population controls.

From a developer perspective, the lesson is to encode the inference target directly. Are you estimating the population of all responding firms, all eligible firms in Scotland, or only firms with 10+ employees? Those are three different statistical problems, and each needs its own denominator and control totals. When teams blur these boundaries, they end up with impressive dashboards that are statistically indefensible. For adjacent thinking on segment accuracy and dataset trust, see human-verified data vs scraped directories and text analysis tools for contract review.

Wave structure and module changes

BICS is modular, and not every question is asked every wave. Even-numbered waves contain a core monthly time series, while odd-numbered waves emphasize other domains like trade, workforce, and investment. In practice, this means your code cannot assume a fixed set of columns or fixed answer categories. A robust survey pipeline should therefore align question metadata to each wave, normalize labels, and version the mapping from raw responses to analysis categories.

This modularity is exactly why periodic survey automation is a data engineering problem. You need to handle schema drift without corrupting the statistical lineage of the output. If your operational stack already includes scheduled ingestion and transform orchestration, you’ll recognize the pattern from systems built for micro-automation and production agent integrations. The difference is that here the failure mode is not a broken workflow, but a misleading estimate.

3) Building standard expansion estimation in Python

Core formula and minimal implementation

Standard expansion estimation is the workhorse of survey weighting. For a binary indicator like “business expects turnover to decrease,” the weighted proportion is the sum of weights for respondents with value 1 divided by the sum of weights across all valid respondents. For a total, it is simply the weighted sum of the outcome variable. In Python, pandas is enough for a clean first implementation, but you must be precise about missing data and denominator rules.

Here is a compact pattern:

import pandas as pd

def weighted_share(df, value_col, weight_col, valid_mask=None):
    x = df.copy()
    if valid_mask is not None:
        x = x.loc[valid_mask].copy()
    valid = x[value_col].notna() & x[weight_col].notna()
    x = x.loc[valid]
    return (x[value_col] * x[weight_col]).sum() / x[weight_col].sum()


def weighted_total(df, value_col, weight_col):
    valid = df[value_col].notna() & df[weight_col].notna()
    return (df.loc[valid, value_col] * df.loc[valid, weight_col]).sum()

This pattern is intentionally simple so it can be tested, reviewed, and ported into a data pipeline. The critical engineering detail is that denominator logic should be explicit and stable across waves. For example, if a question allows “not answered” or “not applicable,” you should exclude those records before computing shares, but preserve them for response-rate diagnostics. That separation between analysis universe and response universe is foundational in survey production.

Worked example with a Scotland-style subset

Imagine a wave with 500 Scottish respondents, where 120 represent a business size group that is under-sampled. If their average base weight is 3.0 while another group’s average is 0.8, a weighted percentage can diverge sharply from the raw share. Suppose 40% of the under-sampled group reports staff shortages, while only 20% of the overrepresented group does. An unweighted estimate could land near the middle, but the weighted estimate will tilt toward the under-sampled group because it represents more of the population.

That’s why validation should always compare raw and weighted outputs, not just weighted outputs alone. Large shifts may be appropriate, but they should be explainable by the sample composition. In production, build a validation report that shows row counts, weight sums, min/max weights, and the delta between unweighted and weighted estimates. This is the same kind of sanity checking you’d apply before releasing any operational analytics artifact, similar to the discipline described in operations KPI tracking and step-by-step spend planning.

Weight trimming and stability checks

In the real world, very large weights can dominate an estimate and increase variance. Weight trimming caps extreme weights to reduce instability, but it is not free: trimming introduces bias even as it may lower variance. That tradeoff should be controlled by policy and documented per wave. A good production approach is to compute estimates both before and after trimming, then compare the sensitivity of key metrics.

You should also test for zero or near-zero weight totals in any subgroup you report. If a subgroup has only a handful of responses or highly concentrated weights, its estimate can be unstable even if the code runs successfully. In a governance context, that is where automatic suppression, warning flags, or minimum-cell rules should kick in. Think of this as the statistical version of fail-safe design in live systems and review processes, like the principles in auditability and permissions and runtime configuration controls.

4) Stratified weighting and calibration logic

Why stratification changes the estimator

Stratified surveys intentionally divide the population into groups with different selection probabilities. If one stratum is oversampled, each sampled unit from that stratum gets a smaller weight; if a stratum is undersampled, the weight is larger. In Python, the most common implementation pattern is to merge stratum metadata onto the respondent table, then compute a base weight as population total divided by sample count within each stratum. If response propensity differs by stratum, you may layer nonresponse adjustment on top.

Here’s a conceptual example:

strata = pd.DataFrame({
    'stratum': ['A', 'B'],
    'pop_n': [10000, 5000],
    'sample_n': [200, 50]
})
strata['base_wt'] = strata['pop_n'] / strata['sample_n']

The resulting base weights are then joined back to the survey responses. This is a transparent starting point because it reflects only design weights. If you later add calibration to known margins, keep the original design weight and the adjusted weight as separate columns. That split lets you audit how much the calibration step changes the estimate and makes model drift easier to detect.

Post-stratification and calibration to known totals

Many production survey pipelines add calibration, also called post-stratification, to align weighted sample margins with known population totals. For example, if you know the population breakdown of businesses by size class or industry sector, you can adjust weights so the weighted sample matches those control totals. This reduces bias from differential nonresponse and improves comparability across waves, provided the margins are reliable and the strata are meaningful.

The engineering rule is to treat control totals as versioned reference data. Store the source, date, and classification code alongside the totals, then assert they match the intended wave before running the estimator. If a classification taxonomy changes, your pipeline should fail loudly rather than silently recalibrate to stale margins. This level of rigor is similar to how teams protect downstream systems from upstream changes in procurement decisions and creative operations templates, where process quality determines output quality.

Validation against known benchmarks

To validate a weighted estimate, compare it against published benchmarks, prior waves, or internal backtests. If the Scottish publication shows a stable trend in a core measure, your pipeline should reproduce that direction and approximate magnitude when run on the same microdata and rules. The goal is not bit-for-bit duplication of every headline, because exact outputs may depend on suppressed records or microdata access constraints. Instead, you want the same estimator family, consistent denominators, and credible tolerance bands.

Build a validation matrix that includes weighted shares, weighted totals, subgroup estimates, and wave-over-wave deltas. For each output, define acceptable absolute and relative error thresholds. Then track those thresholds in CI so changes to code or input data trigger review when the outputs move unexpectedly. For more on building reliable, testable connectors and workflow logic, see automation for dev and IT teams and analytics engineering for high-performance retail systems.

5) Designing a reproducible Python pipeline for periodic waves

Ingestion, versioning, and schema checks

A repeatable weighting workflow starts with ingesting raw microdata into immutable storage. Each survey wave should land in a partitioned directory or table with a clear wave identifier, publication date, and source checksum. Then run a schema check that validates expected columns, allowable values, and missingness rates before any transformation. This prevents downstream estimates from silently shifting when a source field is renamed or a category is added.

In practice, you can use pandas for transforms, pydantic or pandera for schema validation, and a scheduler such as Airflow, Dagster, or Prefect to orchestrate runs. The important thing is to make the pipeline idempotent. If wave 154 reruns, it should overwrite only its own outputs and not contaminate previous waves. That is the same operational principle behind resilient data products in capacity planning and tracking pipeline QA.

Wave metadata and question mapping

Because BICS is modular, a production pipeline needs a metadata layer that maps each wave to the questions asked and the analysis definitions used. For example, if a question appears only in odd-numbered waves, you should store that fact so the dashboard knows when a time series should be shown and when it should be blank or marked as not comparable. Metadata should include question text, response codes, analytical grouping, and any exclusion logic for specific sectors or business sizes.

This is where many survey systems fail: they hard-code labels into notebooks and then break on the next questionnaire revision. Avoid that by keeping the transformation rules in configuration files, preferably YAML or JSON, and version them with the code. That way a wave-specific change becomes a controlled configuration update rather than a code fork. This pattern also resembles well-run connector ecosystems and runtime-configurable systems, like the approaches in SDK patterns and runtime configuration UIs.

Publishing outputs with provenance

Every output table should carry provenance fields: wave, run ID, code commit hash, input file hash, weight method, trimming rule, and control-total version. Those fields are what make the estimate reproducible months later. Without provenance, your team may know the number is “from wave 153,” but not exactly which rule set generated it. In a regulated or public-sector environment, that ambiguity is expensive.

A practical artifact model is to publish raw metrics, weighted metrics, validation metrics, and metadata in separate but linked tables. This makes it easy to feed both BI dashboards and QA reporting. It also lets consumers choose the right layer for their use case: analysts can inspect the raw sample, while executives see the validated estimate. If you need patterns for managing data products responsibly, explore our pieces on governance and live analytics safeguards.

6) Validation framework: proving your weighted estimates are trustworthy

Unit tests for the estimator

Your statistical code should be tested like any other critical library. Start with synthetic fixtures where you know the correct answer exactly. A small dataset with two strata, known population counts, and known respondent values can prove your weighted total and weighted share functions behave correctly. Also test edge cases: missing weights, all-zero weights, empty subgroups, and a stratum with one respondent.

Unit tests should cover the estimator math, not just the plumbing. That means asserting exact sums where possible and acceptable tolerance where floating-point arithmetic applies. Keep the tests close to the transformation code so refactors do not drift away from statistical intent. If your team does CI/CD well, this will feel familiar, much like validating transformations in experiment-driven measurement and live financial conversion pipelines.

Backtesting against published estimates

One of the strongest validation techniques is to reproduce a historical wave using the same microdata and methodology and compare your output to a published benchmark. For Scotland-style BICS estimates, that means checking whether your weighted share for a core measure lands in the same plausible band as the official estimate. If it does not, inspect the population universe, the denominator rules, and the treatment of sparse groups before assuming the math is wrong.

Backtesting also helps detect changes in source data semantics. If a category that used to mean “business expects turnover to increase” now includes a slightly different response code, your historical comparison will drift even if the code is untouched. That is why validation should include categorical mapping checks, not only numeric assertions. This kind of regression discipline is similar to the way product teams monitor changes in user behavior or launch outcomes, as discussed in launch delay planning and platform policy change readiness.

Thresholds, flags, and suppression

Not every estimate deserves to be published. Small bases, unstable weights, or high variance can make a result technically computable but practically untrustworthy. Your validation layer should therefore assign quality flags and potentially suppress certain outputs. A typical rule might flag any subgroup with fewer than a minimum number of unweighted respondents or a coefficient of variation above a threshold.

The important thing is consistency. If the rules vary by wave or analyst, users will not know what to trust. Encode them centrally, document them in the output metadata, and make them visible in the published report. This is a good place to apply the same operational discipline used in KPI governance and risk-based thresholds.

7) Example table: raw, weighted, and operational comparisons

The table below summarizes how common estimation choices behave in production survey pipelines. Use it as a checklist when deciding what to ship, what to test, and what to suppress.

MethodBest forProsRisksOperational note
Unweighted meanDescribing responders onlySimple, fastBiased for population inferenceUseful as a QA baseline, not a publication metric
Expansion estimationPopulation totals and sharesTransparent, easy to explainSensitive to extreme weightsStore base weights and validation outputs separately
Stratified weightingKnown design strataImproves representativenessRequires accurate population totalsVersion control control totals and strata definitions
Post-stratificationAligning with marginsReduces bias from nonresponseCan overfit if margins are staleFail closed when classification codes change
Trimmed weightsStabilizing volatile estimatesReduces varianceIntroduces biasPublish trimming rules and sensitivity checks

When teams compare methods, they often discover that the weighted estimate is less “smooth” than the raw sample but more defensible. That is normal. The key is that the operational process makes the tradeoff visible rather than burying it. If you build analytics systems around that principle, you’ll find it easier to support stakeholders who care about accuracy, not just speed.

Pro Tip: Treat every weighting run like a software release. Tag the code, archive the input, snapshot the control totals, and generate a validation report. That habit dramatically reduces “why did this number change?” investigations later.

8) Automating periodic survey waves end to end

Scheduling and orchestration

Once the estimator is validated, automation turns it into a repeatable service. A wave scheduler should watch for new microdata drops, launch the transform job, run validation, and publish the outputs if quality gates pass. If the pipeline fails, it should alert the owner with enough context to diagnose the issue quickly. Avoid manual reruns unless there is a documented emergency procedure, because those reruns often become undocumented forks in statistical logic.

A clean orchestration pattern is: ingest, validate schema, compute weights, estimate metrics, validate outputs, publish artifacts, notify stakeholders. Each step should produce a durable artifact so failures are recoverable without recomputation of earlier stages. This pattern is not unique to survey analytics; it’s the same lifecycle you’d expect in mature operational systems, from traffic-aware scaling to equipment maintenance automation.

Observability for data quality

Monitoring should include both technical and statistical signals. Technical metrics: job duration, input file size, schema failures, and row counts. Statistical metrics: sum of weights, share of missing values, estimate variance proxies, and wave-over-wave deltas for core measures. A sudden shift in the weight distribution is often an earlier warning than a dashboard anomaly, so capture it as a first-class metric.

Log these metrics into a warehouse or observability stack and set alerts on thresholds that indicate a likely upstream change. For example, if the average weight in a key stratum doubles after a source refresh, that may reflect a changed sample design or a broken mapping. The best systems make that visible immediately. If your team already manages production analytics, this aligns closely with the principles in financial reporting controls and tracking error reduction.

Publishing to downstream consumers

Once validated, outputs should be delivered in a format that downstream users can consume without reimplementation. That might be a CSV export for statisticians, a parquet dataset for analysts, or a JSON API for application teams. The important thing is consistency: same column names, same wave identifiers, same suppression flags, same metadata. If the data product is meant to be reused, make the interface stable.

Many teams underestimate the value of a clean handoff. The more obvious the interface, the fewer support tickets and “quick fixes” accumulate later. Good publication design is not unlike good packaging in other domains: the consumer should get exactly what they expect, in a stable form, with enough context to trust it. That ethos shows up in our reading on SDK ergonomics and workflow automation.

9) Common failure modes and how to avoid them

Mistaking sample proportions for population estimates

The most common error is publishing a sample proportion as if it were a population estimate. This happens when weighting is optional instead of required in the reporting layer. Fix it by making weighted outputs the default and labeling raw outputs as QA-only. If a metric is intentionally unweighted, document why and restrict its use to descriptive response analysis.

In practice, the easiest way to stop this mistake is to separate analysis tables from publication tables. The analysis table can contain everything, but the publication table should only contain approved, validated, and appropriately weighted metrics. This prevents accidental leakage of non-publication-grade figures into executive dashboards.

Ignoring denominator drift across waves

Another common issue is denominator drift. A question that was asked of all businesses in one wave may later be asked only of a subset, or answer categories may be rewritten. If you do not track that change, wave-over-wave comparisons become misleading. The fix is to encode the denominator definition in metadata and to version the logic whenever a question or universe changes.

This is one of the reasons reproducibility matters so much. A number without a denominator definition is just a floating value. For more on protecting against hidden operational drift, see our guides on policy-change preparedness and safe testing when systems change.

Publishing unstable small-area estimates

Finally, teams often over-publish. A regional estimate built from too few responses can be noisy even if the weighting code is correct. A good governance policy will suppress or flag those estimates, or roll them into broader categories. The publication should make that rule visible so users know not to over-interpret marginal values.

That level of restraint is not a limitation; it is a sign of statistical maturity. In a world where automated systems are often optimized for output volume, trustworthy survey estimation wins by being conservative when uncertainty is high.

10) A practical implementation checklist for your team

Before you code

Start by documenting the survey universe, stratification variables, available margins, and intended publication measures. Decide whether your target is the full population or a restricted universe like businesses with 10+ employees. Then define the quality gates: minimum base sizes, acceptable variance, trimming thresholds, and suppression rules. If these are ambiguous, the code will not save you later.

It also helps to write a small statistical contract for the pipeline. This should include input schema, output schema, and the exact estimator definitions. Treat it like an API spec that analysts and engineers both sign off on. This is similar in spirit to how reliable connector ecosystems define behavior up front in SDK design and governance frameworks.

During implementation

Implement the estimator in small, testable functions. Keep the weight construction, calibration, and aggregation steps separate. Store every intermediate artifact so you can debug discrepancies. Use synthetic fixtures for unit tests and historical backtests for integration tests. If you need a quick operational analogy, think of it as building an analytics pipeline with clear checkpoints rather than a monolithic notebook.

Where possible, compute and compare both weighted and unweighted versions of each key metric. That helps you explain large changes and catch accidental regressions. If the weighted result differs materially from the raw sample, investigate whether that is due to design, response bias, or a logic error. The goal is not to eliminate differences, but to understand them.

After deployment

Monitor the pipeline like a production service. Track data drift, estimate drift, runtime failures, and schema changes. Review a sample of wave outputs each release to ensure metadata and suppression flags are correct. If a source organization changes the questionnaire or microdata access method, treat it as a release event, not a silent refresh.

This is where many teams discover that the hardest part of statistical weighting is not the formula, but the operating model. If you get the operating model right, the math becomes repeatable. If you get it wrong, even a correct formula can produce untrusted outputs. That principle is as true for survey estimation as it is for any mission-critical data system.

Conclusion

Reproducible statistical weighting in Python is best approached as a production data product, not a one-off analysis script. Start with a transparent estimator, encode your strata and population controls explicitly, validate against known benchmarks, and automate the entire wave lifecycle with schema checks, provenance, and quality gates. The BICS Scotland methodology is a useful model because it shows where weighting improves inference and where the population base is too thin to support confident estimation. If your team can make those decisions explicit, your survey outputs become far more credible and far easier to maintain.

Most importantly, don’t separate statistics from engineering. The best survey pipelines are the ones that make assumptions visible, preserve reproducibility, and surface uncertainty before it becomes a reporting problem. That is what turns a simple weighted average into a trustworthy, scalable analytical service.

Frequently Asked Questions

What is the difference between expansion estimation and post-stratification?

Expansion estimation assigns each respondent a weight so it represents a number of population units, usually derived from the sample design. Post-stratification adjusts those weights after the fact so weighted margins match known population totals. In production, you often use both: design weights first, then calibration to known totals.

How do I know if my weighted estimate is more reliable than the unweighted one?

Reliability is not guaranteed by weighting alone. Compare your estimate to published benchmarks, inspect base sizes, and review how sensitive the result is to trimming or small changes in control totals. If the weighted result is consistent across waves and matches known population structure better than the raw sample, it is usually the better inference.

What Python stack should I use for survey weighting?

Pandas is enough for many implementations, especially for expansion estimation and stratified base weights. Add pandera or pydantic for schema validation, pytest for unit tests, and an orchestrator such as Airflow, Dagster, or Prefect for scheduled waves. If you need reproducibility and lineage, store intermediate artifacts and metadata in your warehouse or object storage.

Should I trim extreme weights?

Sometimes, but only with clear policy and documentation. Trimming can reduce variance and stabilize outputs, but it introduces bias. The right approach is to test both trimmed and untrimmed versions, quantify the sensitivity, and publish the rule used.

Why does BICS use different universes for some Scotland estimates?

The Scotland publication notes that businesses with fewer than 10 employees are excluded because the response base is too small for suitable weighting. That is a practical design choice: if the sample cannot support stable inference for a subgroup, narrowing the universe can be more trustworthy than forcing a weak estimate.

How should I handle changing survey questions across waves?

Version your question mapping and denominator rules by wave. Do not hard-code labels in analysis notebooks. Instead, keep a metadata layer that records which question was asked, what response codes were used, and whether the metric is comparable across waves.

Advertisement

Related Topics

#python#data pipeline#statistical methods
D

Daniel Mercer

Senior SEO Editor & Data Strategy Lead

Senior editor and content strategist. Writing about technology, design, and the future of digital media. Follow along for deep dives into the industry's moving parts.

Advertisement
2026-04-17T02:23:15.072Z