<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://sunpy.org/</id>
  <title>Blog - Posts tagged gsoc</title>
  <updated>2026-04-16T16:25:23.813076+00:00</updated>
  <link href="https://sunpy.org/"/>
  <link href="https://sunpy.org/blog/tag/gsoc/atom.xml" rel="self"/>
  <generator uri="https://ablog.readthedocs.io/" version="0.11.13">ABlog</generator>
  <entry>
    <id>https://sunpy.org/posts/2018/2018-10-20-time/</id>
    <title>Transition from datetime to astropy.time</title>
    <updated>2018-10-20T00:00:00+00:00</updated>
    <author>
      <name>Vishnunarayan K I</name>
    </author>
    <content type="html">&lt;div class="admonition note"&gt;
&lt;p&gt;This blog post was written in a &lt;a class="reference external" href="https://github.com/sunpy/sunpy.org/blob/main/posts/2018/2018-10-20-time.ipynb"&gt;Jupyter notebook&lt;/a&gt;.
Click here for an interactive version:
&lt;span class="raw-html"&gt;&lt;a href="https://mybinder.org/v2/gh/sunpy/sunpy.org/main?filepath=posts/2018/2018-10-20-time.ipynb"&gt;&lt;img alt="Binder badge" src="https://mybinder.org/badge.svg" style="vertical-align:text-bottom"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;section id="Transition-from-datetime-to-astropy.time"&gt;

&lt;p&gt;The SunPy project is very happy to announce that the time handling in SunPy will be transitioned from python &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime&lt;/span&gt;&lt;/code&gt; module to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time&lt;/span&gt;&lt;/code&gt; module. The changes for this transition are under review in the pull request &lt;a class="reference external" href="https://github.com/sunpy/sunpy/pull/2691"&gt;#2691&lt;/a&gt;. These changes are scheduled for &lt;strong&gt;SunPy 1.0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This comes with numerous benefits:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support for non-UTC time scales&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;UTC as well as non-UTC time scales like TAI, TT, UT1 etc. can be used with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time.Time&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[1]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;astropy.time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;

&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2012-06-18T02:00:05.453&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tai&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[1]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
&amp;lt;Time object: scale=&amp;#39;tai&amp;#39; format=&amp;#39;isot&amp;#39; value=2012-06-18T02:00:05.453&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt; also provides easy conversion between different scales.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[2]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[2]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
&amp;lt;Time object: scale=&amp;#39;utc&amp;#39; format=&amp;#39;isot&amp;#39; value=2012-06-18T01:59:31.453&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Support for high precision times.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt; can provide sub-nanosecond precision for time objects while python &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime&lt;/span&gt;&lt;/code&gt; was restricted to microseconds.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[3]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[3]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
&amp;lt;Time object: scale=&amp;#39;tai&amp;#39; format=&amp;#39;isot&amp;#39; value=2012-06-18T02:00:05.453000000&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Support for leap seconds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This was one of the bigger motivation for the transition to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time.Time&lt;/span&gt;&lt;/code&gt;. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime&lt;/span&gt;&lt;/code&gt; has no support for leap second while &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt; supports leap seconds. A leap second is a one-second adjustment applied to UTC to keep it close to the mean solar time.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[4]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;astropy.units&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;u&lt;/span&gt;

&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2016-12-31T23:59:60&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2016-12-31T23:59:59&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[4]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
(&amp;lt;Time object: scale=&amp;#39;utc&amp;#39; format=&amp;#39;isot&amp;#39; value=2016-12-31T23:59:60.000&amp;gt;,
 &amp;lt;Time object: scale=&amp;#39;utc&amp;#39; format=&amp;#39;isot&amp;#39; value=2016-12-31T23:59:60.000&amp;gt;)
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Support for numerous formats&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt; can parse numerous formats including python &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[5]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FORMATS&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[5]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
OrderedDict([(&amp;#39;jd&amp;#39;, astropy.time.formats.TimeJD),
             (&amp;#39;mjd&amp;#39;, astropy.time.formats.TimeMJD),
             (&amp;#39;decimalyear&amp;#39;, astropy.time.formats.TimeDecimalYear),
             (&amp;#39;unix&amp;#39;, astropy.time.formats.TimeUnix),
             (&amp;#39;cxcsec&amp;#39;, astropy.time.formats.TimeCxcSec),
             (&amp;#39;gps&amp;#39;, astropy.time.formats.TimeGPS),
             (&amp;#39;plot_date&amp;#39;, astropy.time.formats.TimePlotDate),
             (&amp;#39;datetime&amp;#39;, astropy.time.formats.TimeDatetime),
             (&amp;#39;iso&amp;#39;, astropy.time.formats.TimeISO),
             (&amp;#39;isot&amp;#39;, astropy.time.formats.TimeISOT),
             (&amp;#39;yday&amp;#39;, astropy.time.formats.TimeYearDayTime),
             (&amp;#39;datetime64&amp;#39;, astropy.time.formats.TimeDatetime64),
             (&amp;#39;fits&amp;#39;, astropy.time.formats.TimeFITS),
             (&amp;#39;byear&amp;#39;, astropy.time.formats.TimeBesselianEpoch),
             (&amp;#39;jyear&amp;#39;, astropy.time.formats.TimeJulianEpoch),
             (&amp;#39;byear_str&amp;#39;, astropy.time.formats.TimeBesselianEpochString),
             (&amp;#39;jyear_str&amp;#39;, astropy.time.formats.TimeJulianEpochString)])
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nbinput docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[6]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="input_area highlight-python notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="nboutput nblast docutils container"&gt;
&lt;div class="prompt highlight-none notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[6]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="output_area docutils container"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;
&amp;lt;Time object: scale=&amp;#39;utc&amp;#39; format=&amp;#39;datetime&amp;#39; value=2019-03-20 19:19:05.112429&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="Changes-to-SunPy"&gt;
&lt;h2&gt;Changes to SunPy&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;All functions which used to return&lt;/strong&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime&lt;/span&gt;&lt;/code&gt; &lt;strong&gt;now return&lt;/strong&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;All functions which return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime.timedelta&lt;/span&gt;&lt;/code&gt; now return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time.TimeDelta&lt;/span&gt;&lt;/code&gt;. For example, the properties of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.time.TimeRange&lt;/span&gt;&lt;/code&gt; which used to return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime.datetime&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime.timedelta&lt;/span&gt;&lt;/code&gt; now return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time.Time&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time.TimeDelta&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Changes to&lt;/strong&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sunpy.time.parse_time&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~sunpy.time.parse_time&lt;/span&gt;&lt;/code&gt; has been reduced to a tiny wrapper over&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt;. The API of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~sunpy.time.parse_time&lt;/span&gt;&lt;/code&gt; is mostly similar to that of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt;. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~sunpy.time.parse_time&lt;/span&gt;&lt;/code&gt; supports parsing a few more formats than &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~astropy.time.Time&lt;/span&gt;&lt;/code&gt;, which are &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;numpy.datetime64&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pandas.Series&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pandas.DatetimeIndex&lt;/span&gt;&lt;/code&gt;, “UTime” and a few other time formats.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The work on the transition from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;datetime&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;astropy.time.Time&lt;/span&gt;&lt;/code&gt; was done as a part of Vishnunarayan’s Google Summer of Code 2018 project. To see more about the project:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://medium.com/&amp;#64;appukuttancr"&gt;Vishnunarayan’s Medium Blog Posts&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</content>
    <link href="https://sunpy.org/posts/2018/2018-10-20-time/"/>
    <summary>This blog post was written in a Jupyter notebook.
Click here for an interactive version:
&lt;a href="https://mybinder.org/v2/gh/sunpy/sunpy.org/main?filepath=posts/2018/2018-10-20-time.ipynb"&gt;&lt;img alt="Binder badge" src="https://mybinder.org/badge.svg" style="vertical-align:text-bottom"&gt;&lt;/a&gt;</summary>
    <category term="gsoc" label="gsoc"/>
    <category term="sunpy" label="sunpy"/>
    <category term="time" label="time"/>
    <published>2018-10-20T00:00:00+00:00</published>
  </entry>
</feed>
