Конвертировать дату в дату в Python - PullRequest
532 голосов
/ 21 декабря 2009

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

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

Ответы [ 11 ]

675 голосов
/ 21 декабря 2009

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

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
107 голосов
/ 21 декабря 2009

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

>>> 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 или класса для datetime.

57 голосов
/ 19 марта 2014

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

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

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

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

40 голосов
/ 21 декабря 2009

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

args = d.timetuple()[:6]
datetime.datetime(*args)
6 голосов
/ 03 января 2016

Начиная с 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()

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

4 голосов
/ 04 января 2015

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

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
3 голосов
/ 09 мая 2015

Вы можете использовать easy_date , чтобы упростить:

import date_converter
my_datetime = date_converter.date_to_datetime(my_date)
0 голосов
/ 30 апреля 2019

to_datetime() устарела, теперь она называется to_pydatetime()

0 голосов
/ 23 августа 2017

Использование панд для преобразования серии дат в даты-питоны:

dates = pd.DataFrame(
    {'date': pd.DatetimeIndex(start='2017-01-01', end='2017-01-5', freq='D')})
>>> dates
        date
0 2017-01-01
1 2017-01-02
2 2017-01-03
3 2017-01-04
4 2017-01-05

>>> pd.DatetimeIndex(dates['date']).to_pydatetime().tolist()
[datetime.datetime(2017, 1, 1, 0, 0),
 datetime.datetime(2017, 1, 2, 0, 0),
 datetime.datetime(2017, 1, 3, 0, 0),
 datetime.datetime(2017, 1, 4, 0, 0),
 datetime.datetime(2017, 1, 5, 0, 0)]

Сначала нужно преобразовать даты:

dates = pd.DataFrame(
        {'date': ['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05']})
dates['date'] = pd.DatetimeIndex(dates['date'])
pd.DatetimeIndex(dates['date']).to_pydatetime().tolist()
0 голосов
/ 01 февраля 2013

Я новичок в 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
...