Timestamps & precision
Keep clocks, units, missing values, and identifiers explicit.
On this page
Two clocks, two questions
Receive time can support arrival-order and latency analysis. Exchange time can support event-time analysis. Clock offsets and source batching can affect their difference; it is not a pure network-latency measurement.
| Field | Unit | What it tells you |
|---|---|---|
| local_timestamp | UTC epoch microseconds | When the collector observed the message. |
| timestamp | UTC epoch microseconds | When the exchange says the event occurred. |
| funding_timestamp | UTC epoch microseconds | Funding timestamp in derivative_ticker, only where provided. |
Read the stored types
from datetime import datetime, timedelta, timezoneimport pyarrow.parquet as pq # Reads the footer schema without loading the entire daily file.print(pq.read_schema("BTCUSDT_trades_2026-10-01.parquet")) # Keep the original INT64; convert microseconds without float rounding.local_timestamp_us = 1783728000012000epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)observed_at = epoch + timedelta(microseconds=local_timestamp_us)print(observed_at.isoformat())Missing is different from zero
A unified schema does not imply every source supplies every value. A nullable field can contain null when a particular record has no value; it does not mean numeric zero.
Do not fill absent sequence IDs, funding rates, or order counts with zero. Use the registered schemaVersion and field semantics when interpreting a file.
UTC dates and reproducibility
Retail downloads use complete UTC days with inclusive start/end dates; each market, symbol and product has one daily Parquet file. A free monthly sample uses the first complete UTC day of the month, falling back only to the previous month. Save the manifest, schemaVersion and SHA-256 with your research results.