def parse_to_datetime(self, *, datetime_string: str, timezone=pytz.UTC) -> typing.Tuple[str, dt.datetime]: settings = self.dateparser_settings.copy() if not timezone.zone == 'UTC': settings['TO_TIMEZONE'] = timezone.zone search = dateparser.search.search_dates(datetime_string, languages=['en'], settings=settings) if not search: search = ctparse.ctparse(datetime_string) if not search or not isinstance(search.resolution, ctparse.types.Time): raise exceptions.ArgumentError( 'I was not able to find a valid datetime within that query.' ) return datetime_string, timezone.localize(search.resolution.dt) if len(search) > 1: raise exceptions.ArgumentError( 'Two or more datetimes were detected within that query.') return search[0][0], search[0][1]
action="store_true") parser.add_argument( "--book", help= "automatically book the appointment without allowing the user to correct the form(risky).", action="store_true") parser.add_argument("--login", action="store_true") args = parser.parse_args() from ctparse import ctparse from datetime import datetime ts = datetime.now() if (args.login): first_name = input('What is your first name: ') last_name = input('What is your last name: ') appt_time = ctparse( input('Enter the time you want the appointment to be made: '), ts=ts) appt_time = datetime(year=appt_time.resolution.year, month=appt_time.resolution.month, day=appt_time.resolution.day, minute=appt_time.resolution.minute, hour=appt_time.resolution.hour) while (datetime.now() < appt_time): pass driver = webdriver.Firefox() driver.get( "https://www.walmart.com/pharmacy/clinical-services/immunization/scheduled?imzType=covid&r=yes" ) if (not args.login): try: #assert "Python" in driver.title
def get_date(text: str): date_result = ctparse(text) if date_result and date_result.score > -2000: return date_result.resolution.dt return None
def parse_relative_date(data_to_parse=None): """ Return a ctparse.Time dict and a datetime object for a string of relative date and/or time to parse. Parameters ---------- data_to_parse : string string with relative time information which should be parsed into absolute datetime object Returns ------- dict: date/time data + datetime object example_output = { 'mstart': 0, 'mend': 8, 'year': 2019, 'month': 11, 'day': 5, 'hour': 17, 'minute': 33, 'DOW': None, 'POD': None, 'dt': datetime.datetime(2019, 11, 5, 17, 33) } """ string_to_parse = None if isinstance(data_to_parse, list): string_to_parse = " ".join(data_to_parse) elif isinstance(data_to_parse, str): string_to_parse = data_to_parse if string_to_parse is None: logging.warning( "Trying to parse date but submitted data is not a string or a list." ) return None logging.debug("%s START ctparse %s" % ("*" * 10, "*" * 50)) parsed_date = ctparse(string_to_parse) logging.debug("%s END ctparse %s" % ("*" * 10, "*" * 52)) if parsed_date is None or parsed_date.resolution is None: logging.debug("Unable to parse a date from string: %s" % string_to_parse) return None data_parts = parsed_date.resolution # just do some own additional parsing time_string = string_to_parse[data_parts.mstart:data_parts.mend] if any(keyword in time_string for keyword in ["lunch", "noon", "mittag"]): data_parts.hour = 12 if "morning" in time_string: data_parts.hour = 9 if "afternoon" in time_string: data_parts.hour = 15 if "evening" in time_string: data_parts.hour = 18 # unable to determine time of the day # use current time if data_parts.hour is None: now = datetime.today() data_parts.hour = now.hour data_parts.minute = now.minute # if minute returned None set to full hour if data_parts.minute is None: data_parts.minute = 0 dt = None try: dt = datetime(year=data_parts.year, month=data_parts.month, day=data_parts.day, hour=data_parts.hour, minute=data_parts.minute) except TypeError: pass if data_parts: logging.debug( "Parsed date from string (%s): %s" % (string_to_parse[data_parts.mstart:data_parts.mend], parsed_date)) else: logging.debug("Unable to parse a date from string: %s" % string_to_parse) return_data = data_parts.__dict__ return_data["dt"] = dt return return_data
def test_military_time(): result = ctparse.ctparse("3 March 2020", ts=datetime(2020, 2, 25)) assert result assert str(result.resolution) == "2020-03-03 X:X (X/X)"
def test_parse_years_ahead(): result = ctparse.ctparse("3 March 2023", ts=datetime(2020, 2, 25)) assert result assert str(result.resolution) == "2023-03-03 X:X (X/X)"