<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: The Sideline</title>
    <description>The latest articles on DEV Community by The Sideline (@thesidelineco).</description>
    <link>https://dev.to/thesidelineco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4223053%2F47d65f84-e6ee-4102-98a5-0df28dafc380.png</url>
      <title>DEV Community: The Sideline</title>
      <link>https://dev.to/thesidelineco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thesidelineco"/>
    <language>en</language>
    <item>
      <title>Keep file versions and observation dates separate when reading a CSV</title>
      <dc:creator>The Sideline</dc:creator>
      <pubDate>Mon, 02 Nov 2026 20:39:30 +0000</pubDate>
      <link>https://dev.to/thesidelineco/keep-file-versions-and-observation-dates-separate-when-reading-a-csv-2f1h</link>
      <guid>https://dev.to/thesidelineco/keep-file-versions-and-observation-dates-separate-when-reading-a-csv-2f1h</guid>
      <description>&lt;p&gt;By The Sideline&lt;/p&gt;

&lt;p&gt;A data file can have a release date that differs from the date of its observations. A download time is a third timestamp. Treating them as interchangeable can make a dashboard appear fresher than its inputs.&lt;/p&gt;

&lt;p&gt;The Sideline's public five-row CSV sample provides a small example. It has sample_version and value_as_of fields, plus value_type to identify the modeled quantity. In the sample checked on November 2, 2026, the version is 2026-10-11 and the value-as-of date is 2026-10-05. Those are sample dates, not a claim that the file describes today's complete athlete dataset.&lt;/p&gt;

&lt;p&gt;You can inspect the distinct values before joining or aggregating the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sample.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8-sig&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sample_version&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value_as_of&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value_type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;present&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;]})&lt;/span&gt;
    &lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;present&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;missing:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The point is to expose the distinction before analysis. Keep a file's version as provenance for the artifact. Use the observation date when stating the age of a value. Record the download time separately in your workflow. If future files contain multiple observation dates, do not flatten them into the newest one without explaining which rows are older.&lt;/p&gt;

&lt;p&gt;Preserve the value_type label as well. An estimate remains an estimate after conversion to JSON or insertion into a database. A blank field should remain missing rather than silently becoming zero. A five-row sample demonstrates a format; it does not establish population coverage or grant rights to redistribute a full dataset.&lt;/p&gt;

&lt;p&gt;Download the example: &lt;a href="https://thesideline.co/samples/sideline-college-sports-data-sample.csv" rel="noopener noreferrer"&gt;https://thesideline.co/samples/sideline-college-sports-data-sample.csv&lt;/a&gt;&lt;br&gt;
Field-use and license context: &lt;a href="https://thesideline.co/data/usage" rel="noopener noreferrer"&gt;https://thesideline.co/data/usage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: The Sideline publishes the linked sample. This tutorial was prepared with AI assistance; its field names and distinct date/type values were checked against the public sample.&lt;/p&gt;

</description>
      <category>python</category>
    </item>
  </channel>
</rss>
