mirror of
https://github.com/almet/notmyidea.git
synced 2025-04-28 19:42:37 +02:00
96 lines
No EOL
9.2 KiB
HTML
96 lines
No EOL
9.2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<title>Convert string to duration - Alexis Métaireau</title>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<link rel="stylesheet" href="https://blog.notmyidea.org/theme/css/main.css?v2" type="text/css" />
|
|
<link href="https://blog.notmyidea.org/feeds/all.atom.xml" type="application/atom+xml" rel="alternate"
|
|
title="Alexis Métaireau ATOM Feed" />
|
|
</head>
|
|
|
|
<body>
|
|
<div id="content">
|
|
<section id="links">
|
|
<ul>
|
|
<li><a class="main" href="/">Alexis Métaireau</a></li>
|
|
<li><a class=""
|
|
href="https://blog.notmyidea.org/journal/index.html">Journal</a></li>
|
|
<li><a class="selected"
|
|
href="https://blog.notmyidea.org/code/">Code, etc.</a></li>
|
|
<li><a class=""
|
|
href="https://blog.notmyidea.org/weeknotes/">Notes hebdo</a></li>
|
|
<li><a class=""
|
|
href="https://blog.notmyidea.org/lectures/">Lectures</a></li>
|
|
</ul>
|
|
</section>
|
|
|
|
<header>
|
|
<h1 class="post-title">Convert string to duration</h1>
|
|
<time datetime="2023-10-11T00:00:00+02:00">11 octobre 2023</time>
|
|
|
|
|
|
</header>
|
|
<article>
|
|
<p>I found myself wanting to convert a string to a duration (int), for some configuration.</p>
|
|
<p>Something you can call like this:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="n">string_to_duration</span><span class="p">(</span><span class="s2">"1d"</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="s2">"days"</span><span class="p">)</span>
|
|
<span class="n">string_to_duration</span><span class="p">(</span><span class="s2">"1d"</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="s2">"hours"</span><span class="p">)</span>
|
|
<span class="n">string_to_duration</span><span class="p">(</span><span class="s2">"3m"</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="s2">"hours"</span><span class="p">)</span>
|
|
<span class="n">string_to_duration</span><span class="p">(</span><span class="s2">"3m"</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="s2">"minutes"</span><span class="p">)</span>
|
|
</code></pre></div>
|
|
|
|
<p>The code :</p>
|
|
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Literal</span>
|
|
|
|
<span class="k">def</span> <span class="nf">string_to_duration</span><span class="p">(</span><span class="n">value</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">Literal</span><span class="p">[</span><span class="s2">"days"</span><span class="p">,</span> <span class="s2">"hours"</span><span class="p">,</span> <span class="s2">"minutes"</span><span class="p">]):</span>
|
|
<span class="w"> </span><span class="sd">"""Convert a string to a number of hours, days or minutes"""</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">isdigit</span><span class="p">,</span> <span class="n">value</span><span class="p">)))</span>
|
|
|
|
<span class="c1"># It's not possible to convert from a smaller unit to a greater one:</span>
|
|
<span class="c1"># - hours and minutes cannot be converted to days</span>
|
|
<span class="c1"># - minutes cannot be converted to hours</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">target</span> <span class="o">==</span> <span class="s2">"days"</span> <span class="ow">and</span> <span class="p">(</span><span class="s2">"h"</span> <span class="ow">in</span> <span class="n">value</span> <span class="ow">or</span> <span class="s2">"m"</span> <span class="ow">in</span> <span class="n">value</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"mo"</span><span class="p">,</span> <span class="s2">""</span><span class="p">)))</span> <span class="ow">or</span> <span class="p">(</span>
|
|
<span class="n">target</span> <span class="o">==</span> <span class="s2">"hours"</span> <span class="ow">and</span> <span class="s2">"m"</span> <span class="ow">in</span> <span class="n">value</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"mo"</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span>
|
|
<span class="p">):</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="s2">"Durations cannot be converted from a smaller to a greater unit. "</span>
|
|
<span class="sa">f</span><span class="s2">"(trying to convert '</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">' to </span><span class="si">{</span><span class="n">target</span><span class="si">}</span><span class="s2">)"</span>
|
|
<span class="p">)</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Consider we're converting to minutes, do the eventual multiplication at the end.</span>
|
|
<span class="k">if</span> <span class="s2">"h"</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">*</span> <span class="mi">60</span>
|
|
<span class="k">elif</span> <span class="s2">"d"</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span>
|
|
<span class="k">elif</span> <span class="s2">"w"</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">7</span>
|
|
<span class="k">elif</span> <span class="s2">"mo"</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">30</span> <span class="c1"># considers 30d in a month</span>
|
|
<span class="k">elif</span> <span class="s2">"y"</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">365</span>
|
|
<span class="k">elif</span> <span class="s2">"m"</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Invalid duration value"</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">target</span> <span class="o">==</span> <span class="s2">"hours"</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">/</span> <span class="mi">60</span>
|
|
<span class="k">elif</span> <span class="n">target</span> <span class="o">==</span> <span class="s2">"days"</span><span class="p">:</span>
|
|
<span class="n">num</span> <span class="o">=</span> <span class="n">num</span> <span class="o">/</span> <span class="mi">60</span> <span class="o">/</span> <span class="mi">24</span>
|
|
|
|
<span class="k">return</span> <span class="n">num</span>
|
|
</code></pre></div>
|
|
<p>
|
|
<a href="https://blog.notmyidea.org/tag/python.html">#python</a>, <a href="https://blog.notmyidea.org/tag/conversion.html">#conversion</a> - Posté dans la catégorie <a href="https://blog.notmyidea.org/code/">code</a>
|
|
</p>
|
|
</article>
|
|
<footer>
|
|
<a id="feed" href="/feeds/all.atom.xml"><img src="/theme/rss.svg" /></a>
|
|
</footer>
|
|
</div>
|
|
</body>
|
|
|
|
</html> |