Обработка различных результатов из parsedatetime - PullRequest
3 голосов
/ 27 ноября 2009

Я пытаюсь изучать python после того, как провел последние 15 лет или около того, работая только в Perl и только изредка.

Я не могу понять, как обрабатывать два разных вида результатов из метода парсинга Calendar.parse () из parsedatetime

С учетом этого сценария:

#!/usr/bin/python

import parsedatetime.parsedatetime as pdt
import parsedatetime.parsedatetime_consts as pdc
import sys
import os

# create an instance of Constants class so we can override some of the defaults

c = pdc.Constants()

# create an instance of the Calendar class and pass in our Constants # object instead of letting it create a default

p = pdt.Calendar(c)

while True:
 reply = raw_input('Enter text:')
 if reply == 'stop': 
  break
 else:
  result = p.parse(reply)
  print result
  print

И этот пример запуска:

Введите текст: завтра
(time.struct_time (tm_year = 2009, tm_mon = 11, tm_mday = 28, tm_hour = 9, tm_min = 0, tm_sec = 0, tm_wday = 5, tm_yday = 332, tm_isdst = -1), 1)

Введите текст: 11/28
((2009, 11, 28, 14, 42, 55, 4, 331, 0), 1)

Я не могу понять, как получить вывод, чтобы я мог последовательно использовать результат, например, так:

print result[0].tm_mon, result[0].tm_mday

Это не сработает в случае, когда вход «11/28», потому что выход - просто кортеж, а не struct_time.

Вероятно, простая вещь .. но не для этого новичка. С моей точки зрения вывод Calendar.parse () непредсказуем и сложен в использовании. Любая помощь приветствуется. Тиа.

Ответы [ 2 ]

15 голосов
/ 06 мая 2011

Я знаю, что это старый вопрос, но я столкнулся с этим вчера, и ответ здесь неполный (он потерпит неудачу в случае, если parse () вернет datetime).

Из документов рассмотренного времени:

parse () возвращает кортеж (результат, тип), где тип указывает одно из:

   0 = not parsed at all
   1 = parsed as a date (of type struct_time)
   2 = parsed as a time (of type struct_time)
   3 = parsed as a datetime (of type datetime.datetime)

Это немного странно и, возможно, не самый ясный способ сделать это, но это работает и довольно полезно.

Вот небольшой кусок кода, который преобразует все, что он возвращает, в правильную дату / время Python:

import parsedatetime.parsedatetime as pdt

def datetimeFromString( s ):

    c = pdt.Calendar()
    result, what = c.parse( s )

    dt = None

    # what was returned (see http://code-bear.com/code/parsedatetime/docs/)
    # 0 = failed to parse
    # 1 = date (with current time, as a struct_time)
    # 2 = time (with current date, as a struct_time)
    # 3 = datetime
    if what in (1,2):
        # result is struct_time
        dt = datetime.datetime( *result[:6] )
    elif what == 3:
        # result is a datetime
        dt = result

    if dt is None:
        # Failed to parse
        raise ValueError, ("Don't understand date '"+s+"'")

    return dt
2 голосов
/ 27 ноября 2009

Используйте x = time.struct_time(result[0]), и вы получите struct_time (так что вы можете проверить x.tm_mon и x.tm_mday) независимо от того, является ли result[0] struct_time сам по себе или просто 9-кортежем (Я никогда не слышал о parsedatetime, поэтому я не знаю, почему он несовместим с типом возвращаемого значения, но с помощью этого простого подхода вы можете нейтрализовать это несоответствие).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...