From: "1 hour ago", To: timedelta + accuracy

Is there a function for "reverse humanization"?

For example, given (lines):

  • '1 minute ago'
  • '7 hours ago'
  • '5 days ago'
  • '2 months ago'

May return (apologies for the pseudocode):

  • datetime.now () - timedelta (1 minute), accuracy (60 seconds)
  • datetime.now () - timedelta (7 hours), accuracy (1 hour)
  • datetime.now () - timedelta (5 days), accuracy (1 day)
  • datetime.now () - timedelta (2 months), accuracy (1 month)
+4
source share
2 answers

I used parsedatetime and it worked fine for me. The home page lists some formats that can be processed, for example:

  • In 5 minutes
  • In 5 minutes
  • 2 hours before noon
  • 2 days from tomorrow

The main drawback that I discovered is that it does not make sense in time.

In case it's worth it, a wrapper function is used here, which always returns a datetime object, regardless of whether the input string is relative (like all your examples) or fixed:

 def parse_datetime(datetime_string): datetime_parser = parsedatetime.Calendar(parsedatetime_consts.Constants()) timestamp = datetime_parser.parse(datetime_string) if len(timestamp) == 2: if timestamp[1] == 0: raise ValueError(u'Failed to parse datetime: %s' % datetime_string) timestamp = timestamp[0] return datetime.fromtimestamp(time.mktime(timestamp)) 
+1
source

Can you just write a simple implementation yourself, for example:

 import datetime def parsedatetime(str_val): parts = str_val.split(' ') if len(parts) != 3 and parts[2] != 'ago': raise Exception("can't parse %s" % str_val) try: interval = int(parts[0]) except ValueError,e : raise Exception("can't parse %s" % str_val) desc = parts[1] if 'second' in desc: td = datetime.timedelta(seconds=interval) elif 'minute' in desc: td = datetime.timedelta(minutes=interval) elif 'hour' in desc: td = datetime.timedelta(minutes=interval*60) elif 'day' in desc: td = datetime.timedelta(days=interval) else: raise Exception("cant parse %s" % str_val) answer = datetime.datetime.now - td return answer 

The entrance does not look so diverse.

+1
source

Source: https://habr.com/ru/post/1337618/


All Articles