Конвертировать дату в дату в Python

632

Есть ли встроенный метод для преобразования dateв a datetimeв Python, например, для получения datetimeполуночи заданной даты? Обратное преобразование легко: datetimeесть .date()метод.

Мне действительно нужно звонить вручную datetime(d.year, d.month, d.day)?

EMP
источник
118
Не глупый вопрос; объекты даты должны иметь .datetime()метод; глупо то, что у них нет такого метода.
Загс
9
@Zags: или datetime.from_date()конструктор.
JFS
2
@DavidNemeskey: прочитайте комментарий Загса, на который отвечает мой комментарий. Речь идет о том, какие методы должны были существовать.
JFS
2
@JFSebastian: я понятия не имею, как я пропустил это ... и я полностью согласен.
Дэвид Немески
7
Нет, дата не должна быть подмножеством даты и времени (это даже в названии). Однозначно, какая дата от даты и времени. Но, наоборот, дата - это 24-часовой блок (обычно), поэтому она может иметь много дат. Какая дата пришла бы с даты? Вы не можете всегда так 00:00, потому что, если это время не существует, как например, летнее время пропустило его. Не так просто #
dalore

Ответы:

805

Вы можете использовать datetime.combine(date, time); на время вы создаете datetime.timeобъект, инициализированный до полуночи.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
kiamlaluno
источник
79
Спасибо. В сочетании с тем, что time () возвращает (0,0), я думаю, что это получается самым чистым:datetime.combine(d, time())
EMP
33
Только будьте осторожны, чтобы ваш код не спутал datetime.time () с time.time (). Квалифицированные имена FTW!
Дастин
8
Да, хорошая мысль. К счастью, combin () вызывает исключение, если вы передаете в time.timeили что-то еще, кроме a datetime.time.
EMP
21
Для полуночи есть константа python в datetime.time.min (2.7.1+) или datetime.min.time () (старый python)
larham1
16
Хорошее решение, но я не думаю, что datetime.min.time () - самый чистый способ получить время 00:00:00. Это потому, что он сначала извлекает минимальное значение, представляемое datetime, а затем получает его компонент времени. Между прочим, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) и имеет время 00:00:00. Тем не менее, я думаю, что лучше создать время 00:00:00 через time.min или time (0, 0, 0, 0).
Флорин Думитреску
130

Есть несколько способов, хотя я считаю, что тот, который вы упоминаете (и не любите), является наиболее читабельным.

>>> t=datetime.date.today()
>>> datetime.datetime.fromordinal(t.toordinal())
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(t.year, t.month, t.day)
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(*t.timetuple()[:-4])
datetime.datetime(2009, 12, 20, 0, 0)

и так далее - но в основном все они зависят от надлежащего извлечения информации из dateобъекта и передачи ее обратно в подходящую функцию ctor или class datetime.

Алекс Мартелли
источник
12
Очень хороший момент. datetime(d.year, d.month, d.day)кажется гораздо более читабельным, чем принятый ответ datetime.combine(d, datetime.min.time()).
Саймон Тьюси
2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)кажется чище (предложено @larham1 )
jfs
2
@JF Себастьян: Это несколько чище, но я согласен с Уэсом Уинхемом в его ответе, что он требует, чтобы читатель знал, что представляет datetime.time.min. В то время как мне кажется, что datetime(d.year, d.month, d.day)это более очевидно (дата-время без компонента времени). Однако это второстепенный вопрос, и использование имени переменной, такого как «полночь», делает очевидным, каков будет результат, даже если читатель не знает, что datetime.time.minпредставляет.
Саймон Тьюси
76

Принятый ответ правильный, но я бы предпочел не использовать datetime.min.time()его, потому что для меня не очевидно, что именно он делает. Если это очевидно для вас, тогда больше силы для вас. Я также чувствую то же самое по поводу timetupleметода и опоры на заказ.

На мой взгляд, наиболее читаемый, явный способ сделать это, не полагаясь на то, что читатель хорошо знаком с datetimeAPI модуля:

from datetime import date, datetime
today = date.today()
today_with_time = datetime(
    year=today.year, 
    month=today.month,
    day=today.day,
)

Это мой взгляд на «явное лучше, чем неявное».

Уэс Уинхем
источник
И
шляпный
Я согласен с твоими чувствами. Все эти другие ответы с timetuple и звездочками и min.time () требуют исследования, и способ обработки даты и даты-времени в Python в любом случае немного обременителен по сравнению с простотой, с которой Microsoft обрабатывает их в VBA. Это так же просто, как завернуть их в хэш-символы на этом языке. Но я отвлекся.
Боборт
2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)встроенная функция этого ответа.
Аликандил
Это работает, но вам может потребоваться информация о datetimeчасовом поясе. В этом случае вы можете, import pytzа затем добавить tzinfo=pytz.timezone('Europe/London'), например.
alstr
48

Вы можете использовать date.timetuple()метод и распаковать оператор *.

args = d.timetuple()[:6]
datetime.datetime(*args)
teepark
источник
3
Это полезно для моей ситуации. Я не знаю, проходит ли мне это дата или дата, и не очень питонно проверять, какой это класс. Этот метод выглядит так, как будто он будет работать как с датой, так и с датой.
Гатстер
Я использовал это, прежде чем datetime.combineузнавать через ответ @ kiamlaluno. Я думаю, что это довольно питонично, особенно если учесть, что создание datetime.timeобъекта в datetime.time(*map(int,"H:M:S".split(":")))любом случае может выглядеть примерно так ...
Том
1
Это мой любимый ответ
Nam G VU
8

Сегодня, как и в 2016 году, я думаю, что самое чистое решение предоставлено Pandas Timestamp:

from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)

Временная метка является эквивалентом даты и времени в большинстве случаев. Проверьте:

from datetime import datetime
isinstance(pd.Timestamp(d), datetime)

Но если вы действительно хотите ванильное свидание, вы все равно можете сделать:

pd.Timestamp(d).to_datetime()

Временные метки намного мощнее, чем даты, в том числе при работе с часовыми поясами. На самом деле, временные метки настолько мощные, что жаль, что они так плохо документированы ...

Kadee
источник
Хороший звонок. Я пришел сюда, так как думал, что для решения проблемы DatetimeIndex для панд потребуется python datetime. У панд позора нет понятия DateIndex.
Маленькие столики Бобби
6
зачем нам нужен тяжеловесный пакет только для манипуляции с датой, даже в 2016 году ?!
ковбер
Выносить панд для этого - все равно что бить муравья молотком
Deji S
5

Один из способов преобразования даты в дату, который еще не был упомянут:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
Kadee
источник
1
Да, но преобразование целых чисел в строки и обратно, вероятно, обходится гораздо дороже, чем непосредственная работа со строками, поэтому я бы использовал эту функцию только для обработки небольшого объема
Егор Краев
3

Вы можете использовать easy_date, чтобы сделать это легко:

import date_converter
my_datetime = date_converter.date_to_datetime(my_date)
Рафаэль Амоедо
источник
-10

Если вам нужно что-то быстрое, datetime_object.date()выдает дату объекта datetime.

Bassdread
источник
8
Оператор хочет обратного, чтобы перейти от dateк datetime.
Том
От вопроса: преобразование напротив легко: есть метод. Смелый акцент мой. datetime.date()
Мартин Питерс
-13

Я новичок в Python. Но этот код работал для меня, который преобразует указанный ввод, который я предоставляю в datetime. Вот код Поправьте меня если я ошибаюсь.

import sys
from datetime import datetime
from time import mktime, strptime

user_date = '02/15/1989'
if user_date is not None:
     user_date = datetime.strptime(user_date,"%m/%d/%Y")
else:
     user_date = datetime.now()
print user_date
Napier
источник
У ОП есть datetime.date()объект, а не строка .
Мартин Питерс