36

I'm looking for a way to translate 'tomorrow at 6am' or 'next monday at noon' to the appropriate datetime objects.

I thought of engineering a complex set of rules, but is there another way?

Davide Fiocco
  • 5,350
  • 5
  • 35
  • 72
Vasil
  • 36,468
  • 26
  • 90
  • 114
  • The command `date` can accept some human-readable dates on Linux: `date --date='8:30am next monday` – Flimm Jul 14 '23 at 23:05

2 Answers2

53

parsedatetime - Python module that is able to parse 'human readable' date/time expressions.

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

cal = pdt.Calendar()
now = datetime.now()
print("now: %s" % now)
for time_string in ["tomorrow at 6am", "next moday at noon", 
                    "2 min ago", "3 weeks ago", "1 month ago"]:
   print("%s:\t%s" % (time_string, cal.parseDT(time_string, now)[0]))

Output

now: 2015-10-18 13:55:29.732131
tomorrow at 6am:    2015-10-19 06:00:00
next moday at noon: 2015-10-18 12:00:00
2 min ago:  2015-10-18 13:53:29
3 weeks ago:    2015-09-27 13:55:29
1 month ago:    2015-09-18 13:55:29
jfs
  • 399,953
  • 195
  • 994
  • 1,670
Alex Barrett
  • 16,175
  • 3
  • 52
  • 51
11

See what you think of this example from the pyparsing wiki. It handles the following test cases:

today
tomorrow
yesterday
in a couple of days
a couple of days from now
a couple of days from today
in a day
3 days ago
3 days from now
a day ago
now
10 minutes ago
10 minutes from now
in 10 minutes
in a minute
in a couple of minutes
20 seconds ago
in 30 seconds
20 seconds before noon
20 seconds before noon tomorrow
noon
midnight
noon tomorrow
6am tomorrow
0800 yesterday
12:15 AM today
3pm 2 days from today
a week from today
a week from now
3 weeks ago
noon next Sunday
noon Sunday
noon last Sunday
PaulMcG
  • 62,419
  • 16
  • 94
  • 130