Перетворити дату на дату в Python


632

Чи існує вбудований метод перетворення a dateв a datetimeв Python, наприклад, отримання datetimeпівночі даної дати? Протилежна конверсія проста: datetimeмає .date()метод.

Мені справді доводиться дзвонити вручну datetime(d.year, d.month, d.day)?


118
Не дурне питання; об’єкти дати повинні мати .datetime()метод; що нерозумно - це те, що вони не мають такого методу.
Загс

9
@Zags: або datetime.from_date()конструктор.
jfs

2
@DavidNemeskey: прочитайте коментар Заґса, на який відповідає мій коментар. Йдеться про те, які методи повинні були існувати.
jfs

2
@JFSebastian: Я поняття не маю, як я пропустив це ... і я повністю згоден.
Девід Немескі

7
ні, не повинно бути дата - це підмножина дати (це навіть в назві). Однозначно, яка дата з дати. Але навпаки, побачення - це блок 24 години (як правило), тому він може мати безліч днів. Який час прийматиме побачення? Ти не завжди можеш так 00:00, бо що, якщо цього часу не існує, як, наприклад, перехід на денне світло пропустив його. Не так просто #
dalore

Відповіді:


803

Ви можете використовувати datetime.combine(date, time); на час ви створюєте datetime.timeоб'єкт, ініціалізований до півночі.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())

79
Дякую. У поєднанні з тим, що час () повертається (0,0) Я думаю, що це виходить найчистішим:datetime.combine(d, time())
EMP

33
Будьте обережні, щоб ваш код не переплутав datetime.time () з time.time (). Кваліфіковані імена FTW!
Дастін

8
Так, хороший момент. На щастя, комбінація () створює виняток, якщо ви переходите до іншого time.timeабо іншого, крім а datetime.time.
EMP

21
Опівночі є константа пітона або datetime.time.min (2.7.1+) або datetime.min.time () (старший python)
larham1

16
Гарне рішення, але я не думаю, що datetime.min.time () - це найчистіший спосіб отримати час 00:00:00. Це тому, що для цього потрібно спочатку отримати мінімальне значення, представлене за датою, а потім отримати його часову складову. Між іншим, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) і має час 00:00:00. Однак я думаю, що більш чітко створити час 00:00:00 або через time.min, або через час (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 або classfunction для 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методу та опори на замовлення.

На мою думку, найбільш читаним, явним способом зробити це, не покладаючись на те, щоб читач був дуже знайомий з datetimeмодулем API, це:

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

Це мій погляд на "явне краще, ніж неявне".


І наконечник капелюхи Кайл Гібсон за оригінальну ідею: stackoverflow.com/users/513197/kyle-gibson
Wes Winham

Я згоден з вашими настроями. Усі ці інші відповіді з тимпелетом та зірочками та min.time () вимагають дослідження, а спосіб обробки датами та датами Python у будь-якому разі є дещо громіздким порівняно з легкістю, що Microsoft обробляє їх у VBA. Це так само просто, як загортати їх у хеш-символи на цій мові. Але я відволікаюсь.
Боборт

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)on-line функція цієї відповіді.
aliqandil

Це працює, але, можливо, вам потрібно datetimeзнати про часовий пояс. У такому випадку ви можете, import pytzа потім додати tzinfo=pytz.timezone('Europe/London'), наприклад.
alstr

48

Можна скористатися date.timetuple()методом і розпакувати оператор *.

args = d.timetuple()[:6]
datetime.datetime(*args)

3
Це корисно для моєї ситуації. Я не знаю, чи це дата чи дата, яку мені передають, і не дуже пітонічно перевіряти, який це клас. Цей метод виглядає так, що він буде працювати як для об'єктів дати, так і для дат.
Геттстер

Раніше я користувався цим, перш ніж дізнатися відповідь datetime.combine@ kiamlaluno. Я думаю, що це досить пітонічно, особливо з огляду на те, що побудова datetime.timeоб'єкта, швидше за все, виглядатиме як-небудь datetime.time(*map(int,"H:M:S".split(":")))...
Том,

1
Це моя улюблена відповідь
Nam G VU

9

Сьогодні, 2016 рік, я думаю, що найбільш чітке рішення надає Pandaas 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()

Часові позначки набагато потужніші, ніж дати, серед інших, коли йдеться про часові пояси. Власне, мітки часу настільки потужні, що шкода, що вони так погано задокументовані ...


Гарний дзвінок. Прийшов сюди, як я думав, що знадобиться вирішення проблеми python datetime для проблеми панди DatetimeIndex. Панми сорому не мають поняття DateIndex.
Little Bobby Tables

5
чому нам потрібен важкий пакет саме для того, щоб робити маніпуляції з датою, навіть у 2016 році ?!
коуберт

Витягнути панди для цього - це як взяти молоток до мурашника
Deji S

5

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

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')

1
Щоправда, але перетворення вкладок у рядки та назад, ймовірно, є дорожчим, ніж робота безпосередньо з ints, тому я би використовував цей лише для обробки з низьким обсягом
Єгор Краєв,


-10

Якщо вам потрібно щось швидке, datetime_object.date()дає вам дату об’єкта дати.


8
оп хоче, щоб навпаки, йти з dateдо datetime.
Том

Від питання: перетворення навпаки легко: є метод. , сміливий акцент мій. datetime.date()
Martijn Pieters

-13

Я новачок в Python. Але цей код працював для мене, який перетворює вказаний вхід, який я надаю, до дати. Ось код. Виправте мене, якщо я помиляюся.

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

У ОП є datetime.date()об'єкт, а не рядок .
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.