Объект Python 'datetime.datetime' является неподписанным - PullRequest
1 голос
/ 19 марта 2010

Во-первых, я НЕ разработчик Python. Я пытаюсь исправить проблему в скрипте Python, который выполняется из командной строки. Этот сценарий был написан кем-то, кого больше нет, и он больше не хочет помогать с проблемами.

Это Python 2.5, и на данный момент он не может быть обновлен. Вот строки кода, о которых идет речь:

    start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
    dict_start = datetime(*start_time[:6])

    end_time = datetime.strptime(str(paf.End),"%Y-%m-%d %H:%M:%S")
    dict_end = datetime(*end_time[:6])

Когда этот код запускается, он генерирует ошибку с описанием: объект datetime.datetime неприемлем.

Это оператор импорта:

from datetime import datetime

У меня такое ощущение, что это что-то простое, но я не являюсь моим родным языком, и Google не дает никаких ценных результатов, я застрял. Я пробовал несколько разных методов импорта, выдавая разные ошибки, но все с этими утверждениями. Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 6 ]

2 голосов
/ 19 марта 2010

Похоже, вы просто хотите время, верно?Метод datetime.strptime возвращает объект datetime, поэтому следующие атрибуты содержат время: datetime.day, datetime.hour, datetime.year и т. Д.

1 голос
/ 19 марта 2010

Замечания:

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

Кто бы это ни писал, он путал datetime.datetime.strptime с time.strptime.

Когда-то давно (каламбур) datetime.datetime.strptime не существовало. Нужно было сделать что-то вроде следующего:

>>> from datetime import datetime
>>> import time
>>> time_tuple = time.strptime("2010-03-19 13:22:45","%Y-%m-%d %H:%M:%S")
>>> time_tuple
(2010, 3, 19, 13, 22, 45, 4, 78, -1)
>>> datetime(*time_tuple[:6])
datetime.datetime(2010, 3, 19, 13, 22, 45)

([:6] был мертвой раздачей)

Теперь можно сделать это:

>>> from datetime import datetime
>>> datetime.strptime("2010-03-19 13:22:45","%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 3, 19, 13, 22, 45)
1 голос
/ 19 марта 2010

Похоже, что вызов datetime.strptime на самом деле должен был быть вызовом time.strptime (с отдельным import time в начале модуля) - последний вызов действительно вернет подписываемый объект, подобный кортежу и идиома

xx = time.strptime(...)
yy = datetime.datetime(x[:6])

import time и import datetime в начале модуля, конечно) действительно был каноническим способом разбора строки в экземпляр datetime.datetime до того, как тип datetime.datetime добавил свою собственную функцию strptime который в основном делает только эту работу. Таким образом, он выглядит как «несовершенно перенесенный» код.

Чтобы извлечь только дату (как объект datetime.date, с указанием только года, месяца и дня - без часов, минут, секунд и дробей) из datetime.datetime экземпляра x, вызовите x.date(), который будет вернуть требуемый объект даты (не изменяйте, конечно, x: объекты даты и времени неизменны - вы всегда создаете новые, а не изменяете существующие).

1 голос
/ 19 марта 2010

Роберт, попробуйте заменить

dict_start = datetime(*start_time[:6])

с

dict_start = start_time

и

dict_end = datetime(*end_time[:6])

с

dict_end = end_time

Это выглядит глупо, но, возможно, попробуйте в любом случае. Моя причина такова: datetime.strptime возвращает объект datetime.datetime. Так как код изначально говорит

dict_start = datetime(*start_time[:6])

представляется, что dict_start также должен быть datetime.datetime с теми же 6 полями (год, месяц, день, час, минуты, секунды). Так что попробуйте

dict_start = start_time

Если это не сработает, возможно, вам придется показать нам больше кода, чтобы мы могли составить более точное предположение относительно того, что было задумано.

Редактировать: Самый простой способ получить доступ к отдельным полям (год, месяц, день, час, минуты, секунды) - использовать точку доступа для доступа к атрибутам. Например,

(start_time.year,start_time.month,start_time.day)

дает 3 кортежа с целым годом, месяцем и днем.

PS. Для получения дополнительной информации об объектах datetime см. http://docs.python.org/library/datetime.html.. Может содержать полезные примеры для вас.

1 голос
/ 19 марта 2010

Это не ошибка импорта. Это * start_time [: 6] * end_time [: 6], которое Python не любит. Заменить его

0 голосов
/ 19 марта 2010

Следующий код не имеет смысла для меня:

start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
dict_start = datetime(*start_time[:6])

Если вам нужно отображение кортежа в dict_start, то используйте что-то вроде этого:

start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
dict_start = start_time.timetuple()[:6]

Если вам нужен дикт, то:

start_time = datetime.strptime(str(paf.Start),"%Y-%m-%d %H:%M:%S")
dict_start = dict(zip(('year', 'month' ,'day', 'hour', 'minute', 'second'), start_time.timetuple()[:6]))

- или используйте paf.Start, если это возможно. Кроме того, я не уверен, но возможно, что (год, месяц, день, час, минута, секунда) предопределен где-то в Python std lib или его можно легко заменить другой конструкцией, но здесь полночь, и я не вижу другого очевидного решения.

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