Ȯ$i\dZddlZdZededz dk(sJejdddZejddd Zejddd Zd ZGd d eZGddeZ GddeZ GddeZ GddeZ GddeZ dZdZdZdZdZdZdZy)a Tools for working with dates and times in Excel files. The conversion from ``days`` to ``(year, month, day)`` starts with an integral "julian day number" aka JDN. FWIW: - JDN 0 corresponds to noon on Monday November 24 in Gregorian year -4713. More importantly: - Noon on Gregorian 1900-03-01 (day 61 in the 1900-based system) is JDN 2415080.0 - Noon on Gregorian 1904-01-02 (day 1 in the 1904-based system) is JDN 2416482.0 N)i$ia$iipik )i$-i-ceZdZdZy) XLDateErrorz-A base class for all datetime-related errors.N__name__ __module__ __qualname____doc__Q/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/xlrd/xldate.pyrr#s3rrceZdZdZy)XLDateNegativez``xldate < 0.00``Nr rrrrr'srrceZdZdZy)XLDateAmbiguouszGThe 1900 leap-year problem ``(datemode == 0 and 1.0 <= xldate < 61.0)``Nr rrrrr+sMrrceZdZdZy)XLDateTooLargezGregorian year 10000 or laterNr rrrrr/s#rrceZdZdZy)XLDateBadDatemodez#``datemode`` arg is neither 0 nor 1Nr rrrrr3s)rrc eZdZy)XLDateBadTupleN)r r r rrrrr7srrcf|dvr t||dk(ry|dkr t|t|}||z }tt|dz}d|cxkrdksJJ|dk(r dx}x}}|dz }nt |d\}}t |d\}}|t |k\r t ||dk(rddd|||fS|d kr|dk(r t||t|z} | d zd zd zd zd z| zdzd zd z} | dzd zdzdz} | dzdzdz} | dz} | dk\r| dzdz | dz | |||fS| dzdz | d z| |||fS)aU Convert an Excel number (presumed to represent a date, a datetime or a time) into a tuple suitable for feeding to datetime or mx.DateTime constructors. :param xldate: The Excel number :param datemode: 0: 1900-based, 1: 1904-based. :raises xlrd.xldate.XLDateNegative: :raises xlrd.xldate.XLDateAmbiguous: :raises xlrd.xldate.XLDateTooLarge: :raises xlrd.xldate.XLDateBadDatemode: :raises xlrd.xldate.XLDateError: :returns: Gregorian ``(year, month, day, hour, minute, nearest_second)``. .. warning:: When using this function to interpret the contents of a workbook, you should pass in the :attr:`~xlrd.book.Book.datemode` attribute of that workbook. Whether the workbook has ever been anywhere near a Macintosh is irrelevant. .. admonition:: Special case If ``0.0 <= xldate < 1.0``, it is assumed to represent a time; ``(0, 0, 0, hour, minute, second)`` will be returned. .. note:: ``1904-01-01`` is not regarded as a valid date in the ``datemode==1`` system; its "serial number" is zero. rr)rrrrrrg@riQr<=ie/i:iSiiMi@ ik l) rrintrounddivmod_XLDAYS_TOO_LARGErr _JDN_delta) xldatedatemodexldaysfracsecondshourminutesecondminutesjdnyregmpds rxldate_as_tupler9;s@v)) ~! }V$$ [F F?D%w'(G  5   %!"""v! !"-gr* f "8,,V$$ {1avv.. {x1}f%% :h' 'CQwF*a /1 4 ;d Ba G! KD $;1  #c )B u* !A2IB Rx%rAvq$GG%rAvq$GGrc|rt}n|dkrt}nt}t|}||z }tt |dz}t |d\}}|t j||d|zS)z Convert an Excel date/time number into a :class:`datetime.datetime` object. :param xldate: The Excel number :param datemode: 0: 1900-based, 1: 1904-based. :returns: A :class:`datetime.datetime` object. rgpAir) epoch_1904 epoch_1900epoch_1900_minus_1r'r(r)datetime timedelta)r,r-epochdaysfractionr0 millisecondss rxldate_as_datetimerDsv B;E'E v;D}H%:-./G"7D1G\ 8%%dGQ E EErc(|dzry|dzry|dzryy)Nr rdrir)ys r_leaprHs 1uQ3wq3wq r) NrrrrrrrrrrrcL|\}}}|dvr t||dk(r |dk(r|dk(ryd|cxkrdksntd|||fd|cxkrdksntd |||f|dks!|t|kDr&|d k(r|d k(r t|std |||f|d z}|}|d kr |dz }|dz}n|dz }d|zdzd|zdzdzz|zdz |dzdzdzdzz }|t|z } | dkrtd|||f| dkr|dk(rt d|||ft | S)a Convert a date tuple (year, month, day) to an Excel date. :param year: Gregorian year. :param month: ``1 <= month <= 12`` :param day: ``1 <= day <= last day of that (year, month)`` :param datemode: 0: 1900-based, 1: 1904-based. :raises xlrd.xldate.XLDateAmbiguous: :raises xlrd.xldate.XLDateBadDatemode: :raises xlrd.xldate.XLDateBadTuple: ``(year, month, day)`` is too early/late or has invalid component(s) :raises xlrd.xldate.XLDateError: rrrili'zInvalid year: rrzInvalid month: z Invalid day: r&r%r!r"r i iTrFzInvalid (year, month, day): rzBefore 1900-03-01: )rr_days_in_monthrHr+rfloat) date_tupler-yearmonthdayYpMMpr5r.s rxldate_from_date_tuplerYs"D%v)) qyUaZC1H D D D%3EGHH  " T5#4FHII q u% %cRiEQJ5QU;42DFGG B AAv !V U U "9>sRx"}3 4   SS(A-2 4C :h' 'F {$sASUVV {x1}$s9KMNN =rc|\}}}d|cxkrdkr0nn-d|cxkrdkr"nnd|cxkrdkrnn|dz |zdz |zdz Std|||f)a- Convert a time tuple ``(hour, minute, second)`` to an Excel "date" value (fraction of a day). :param hour: ``0 <= hour < 24`` :param minute: ``0 <= minute < 60`` :param second: ``0 <= second < 60`` :raises xlrd.xldate.XLDateBadTuple: Out-of-range hour, minute, or second rrgN@g8@z Invalid (hour, minute, second): )r) time_tupler1r2r3s rxldate_from_time_tupler]sg&D&&D~2~!v**qF/?R/?$'4/$6$>> $PVAWY ZZrc>t|dd|t|ddzS)a+ Convert a datetime tuple ``(year, month, day, hour, minute, second)`` to an Excel date value. For more details, refer to other xldate_from_*_tuple functions. :param datetime_tuple: ``(year, month, day, hour, minute, second)`` :param datemode: 0: 1900-based, 1: 1904-based. Nr!)rYr])datetime_tupler-s rxldate_from_datetime_tupler`s. ~bq18<~ab12 3r)r r>r+r;r<r=r* ValueErrorrrrrrrr9rDrHrPrYr]r`rrrrbs  ( !}z!}$,,,X  tQ * X  tR , &X&&tR4.4*4[NkN$[$* * [ DHNFD H,^ [ r