Umgang mit "Jahren und Monaten" in Python

Ich schrieb eine Klasse für "Jahre und Monate" in Python, erkannte aber später, dass dies mit dateutil möglich war, sodass es sich um einen Gedenkgottesdienst handelte. Ich habe es mit Schwung geschrieben und es gibt keinen Test, also benutze es auf eigenes Risiko.

Implementierung

import re
from datetime import date


class ym:
    """Datentyp, der das Jahr und den Monat behandelt"""

    def __init__(self, y: int, m: int = None):
        if type(y) is date:
            y, m = y.year, y.month
        if not (0 <= y <= 10000 and 1 <= m <= 12):
            raise ValueError()
        self.x = y * 12 + m - 1

    @classmethod
    def current(cls):
        return cls(date.today())

    @classmethod
    def parse(cls, s: str):
        matched = re.match(r"^(\d+)-(\d+)$", s)
        if not matched:
            raise ValueError()
        return cls(int(matched[1]), int(matched[2]))

    @property
    def y(self):
        return self.x // 12

    @property
    def m(self):
        return self.x % 12 + 1

    def to(self, y, m=None) -> list:
        target = y if type(y) is self.__class__ else self.__class__(y, m)
        return [self + i for i in range(target - self)] if self < target else []

    def __repr__(self):
        cls = self.__class__
        return f"{cls.__module__}.{cls.__name__}({self.y}, {self.m})"

    def __str__(self):
        return f"{self.y:04d}-{self.m:02d}"

    def __add__(self, n: int):
        if type(n) is int:
            return self.__class__((self.x + n) // 12, (self.x + n) % 12 + 1)
        raise TypeError()

    def __sub__(self, n):
        if type(n) is int:
            return self + (-1 * n)
        if type(n) is self.__class__:
            return self.x - n.x
        raise TypeError()

    def __eq__(self, other):
        return self.x == other.x

    def __ne__(self, other):
        return self.x != other.x

    def __lt__(self, other):
        return self.x < other.x

    def __gt__(self, other):
        return self.x > other.x

Beispiel

Erstellen Sie eine Instanz, indem Sie Jahr und Monat angeben

ym(2020, 4)  #=> ym(2020, 4)

Instanz aus aktuellem Monat erstellen

ym.current()  #=> ym(2020, 7)

Erstellen Sie eine Instanz aus einer Zeichenfolge

ym.parse("2020-04")  #=> ym(2020, 4)

Erstellen Sie eine Instanz aus einem Datumsobjekt

from datetime import date

ym.parse(date.today())  #=> ym(2020, 7)
from datetime import datetime

dt = dateime.now()
ym.parse(dt.date())  #=> ym(2020, 7)

Holen Sie sich Jahr, Monat

current = ym.current()  #=> ym(2020, 7)
current.y  #=> 2020
current.m  #=> 7

Addition und Subtraktion

ym(2020, 04) + 10  #=> ym(2021, 2)
ym(2020, 04) - 10  #=> ym(2019, 6)

Jahres- / Monatsunterschied

ym(2020, 7) - ym(2020, 4)  #=> 3

Vergleichsberechnung

ym(2020, 7) < ym(2020, 4)  #=> False
ym(2020, 7) > ym(2020, 4)  #=> True
ym(2020, 7) == ym(2020, 4)  #=> False

Reichweitenerfassung

ym(2020, 4).to(2020, 7)  #=> [ym(2020, 4), ym(2020, 5), ym(2020, 6)]
current = ym.current()  #=> ym(2020, 7)
current.to(current + 6)  #=> [ym(2020, 7), ym(2020, 8), ym(2020, 9), ym(2020, 10), ym(2020, 11), ym(2020, 12)]

Recommended Posts

Umgang mit "Jahren und Monaten" in Python
[Python] Berechnung der Differenz von Datum und Zeit in Monaten und Jahren
Bis zum Umgang mit Python in Atom
Tipps zum Umgang mit Binärdateien in Python
Zeichenkodierung beim Umgang mit Dateien in Python 3
[Python] Umgang mit mehreren Aufruffehlern in ray.init
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Schaben mit Selen in Python
Python und Hardware-Verwenden von RS232C mit Python-
Schaben mit Chromedriver in Python
Debuggen mit pdb in Python
Vorsichtsmaßnahmen beim Umgang mit ROS MultiArray in Python
Umgang mit Sounds in Python
Scraping mit Selen in Python
Berechnen Sie Pose- und Transformationsunterschiede in Python mit ROS
Scraping mit Tor in Python
Tweet mit Bild in Python
Kombiniert mit Ordnungszahl in Python
Stapel und Warteschlange in Python
Starten Sie die numerische Berechnung mit Python (mit Homebrew und Pip).
Japanische Ausgabe beim Umgang mit Python im Visual Studio
Python mit Pyenv und Venv
Unittest und CI in Python
Funktioniert mit Python und R.
Überlegen Sie, wann Sie mit Python3 und Scala3 in 10 Jahren gute Arbeit leisten können.
Veriloggen und Cocotb werden nur zum Entwerfen und Testen von Verilog in Python verwendet.
Spielen Sie mit Mastodons Archiv in Python 2 Count Antworten und Favoriten
Installieren Sie CaboCha in der Ubuntu-Umgebung und rufen Sie es mit Python auf.
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Zahlenerkennung in Bildern mit Python
Leuchtendes Leben mit Python und OpenCV
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Roboter läuft mit Arduino und Python
Testen mit Zufallszahlen in Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Unterschied zwischen list () und [] in Python
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Unterschied zwischen == und ist in Python
Scraping mit Node, Ruby und Python
Zeigen Sie Fotos in Python und HTML an
GOTO in Python mit erhabenem Text 3
Arbeiten mit LibreOffice in Python: Importieren
Sortieralgorithmus und Implementierung in Python
Scraping mit Selen in Python (Basic)
CSS-Analyse mit cssutils in Python
Scraping mit Python, Selen und Chromedriver
Kratzen mit Python und schöner Suppe
Über Python und Cython dtype
Numer0n mit Elementen, die mit Python erstellt wurden
Öffnen Sie UTF-8 mit Stückliste in Python
Zuweisungen und Änderungen in Python-Objekten
JSON-Codierung und -Decodierung mit Python
Verwenden Sie rospy mit virtualenv in Python3
Überprüfen und verschieben Sie das Verzeichnis in Python
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP