Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing human-readable datetime durations in Python [duplicate]

Tags:

python

time

I would like to parse free-text time intervals like the following, using Python:

  • 1 second
  • 2 minutes
  • 3 hours
  • 4 days
  • 5 weeks
  • 6 months
  • 7 years

Is there a painless way to do this, ideally by simply calling a library function?

I have tried:

  • dateutil.parser.parse(), which understands seconds through hours but not days or more.
  • mx.DateTime.DateTimeDeltaFrom(), which understands through days but fails on weeks or higher, and silently (e.g., it might create an interval of length 0, or parse "2 months" as 2 minutes).
like image 386
Reid Avatar asked Aug 18 '26 03:08

Reid


2 Answers

how about pytimeparse lib

Returns the time as a number of seconds:

from pytimeparse.timeparse import timeparse
>>> timeparse('33m')
1980
>>> timeparse('2h33m')
9180
>>> timeparse('4:17')
257
>>> timeparse('5hr34m56s')
20096
>>> timeparse('1.2 minutes')
72

source seems to be here https://github.com/wroberts/pytimeparse

like image 149
Pavel T Avatar answered Aug 20 '26 17:08

Pavel T


This one is new to me, but based on some googling have you tried whoosh?

Edit: There's also parsedatetime:

#!/usr/bin/env python
from datetime import datetime
import parsedatetime as pdt # $ pip install parsedatetime

cal = pdt.Calendar()
for time_str in ['1 second', '2 minutes','3 hours','5 weeks','6 months','7 years']:
    diff = cal.parseDT(time_str, sourceTime=datetime.min)[0] - datetime.min
    print("{time_str:<10} -> {diff!s:>20} <{diff!r}>".format(**vars()))

Output

1 second   ->              0:00:01 <datetime.timedelta(0, 1)>
2 minutes  ->              0:02:00 <datetime.timedelta(0, 120)>
3 hours    ->              3:00:00 <datetime.timedelta(0, 10800)>
5 weeks    ->     35 days, 0:00:00 <datetime.timedelta(35)>
6 months   ->    181 days, 0:00:00 <datetime.timedelta(181)>
7 years    ->   2556 days, 0:00:00 <datetime.timedelta(2556)>
like image 33
Bobby W Avatar answered Aug 20 '26 17:08

Bobby W



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!