Skip to content

TimeFReader

Deserializes a TimeF version directory into an in-memory TimeFDataset. The inverse of TimeFWriter, driven entirely by manifest.json: it never runs connector code. Lives in timenet.reader.

from timenet.reader import TimeFReader

with TimeFReader(version_dir) as reader:
    dataset = reader.read()
    values = dataset.samples[0].time_series[0].to_arrow()

Use it as a context manager: close() (called by __exit__) closes the cached shard file handles.

What is eager vs lazy

__init__ reads the manifest, tasks, annotations, and the time-series index up front. Per-series values and Sample construction stay lazy: read() / iter_samples() build samples with loader closures that pull from the shards only when to_arrow() / to_numpy() is called. iter_samples() streams samples one at a time without building a TimeFDataset.

Type reconstruction

Specs, data sources, and annotation metadata are read straight from the manifest's flat descriptors. There is no runtime class synthesis. TimeSeries.spec is the TimeSeriesSpec descriptor for its spec_type; annotations are rebuilt as real StaticAnnotation / PointAnnotation / IntervalAnnotation instances (values decoded from JSON); tasks are resolved against the built-in TASKS registry with from_tasks linked. Everything pickles and compares equal to the originals field-for-field, which is what makes multiprocessing DataLoader workers safe.

Value reads

A series' loader resolves its index rows (sorted by chunk_idx), reads each chunk with ParquetFile.read_row_group(rg, columns=["values"])[row_offset], and concatenates them into one float32 Arrow array. Shard handles are cached for the reader's lifetime and closed on close().

API

Member Description
read() Materialize the full TimeFDataset.
iter_samples() Yield each Sample lazily.
metadata / schema / tasks The reconstructed metadata, schema, and tasks.

Errors

__init__ raises FileNotFoundError if root, its manifest.json, or any file the manifest lists is missing, and InvalidManifestError (a TimeFFormatError) for a malformed or unsupported-version manifest. Every id cross-reference (annotation, from_task, spec type, index lookup) raises a located ValueError naming the offending id.

Round-trip guarantee

For a dataset that passes writer validation, TimeFReader(...).read() restores every sample's sample_id, view, subject_ids, task_ids, and annotations; each series' spec, channel, source_id, time_series_id, window, and exact float32 values; and each task's payload and resolved from_tasks. TimeSeries object identity is not preserved. time_series_id is the durable handle.


See the API reference for timenet.reader for the full symbol listing.