Python'da tarihi datetime'a dönüştür


632

Var mı yerleşik bir dönüştürülmesi metodu datea datetimealmak örneğin, Python datetimeverilen tarihin geceyarısından için? Ters dönüşüm kolaydır: datetimebir .date()yöntemi vardır.

Gerçekten manuel olarak arama yapmak zorunda datetime(d.year, d.month, d.day)mıyım?


118
Aptalca bir soru değil; tarih nesnelerinin bir .datetime()yöntemi olmalıdır ; saçma olan şey, böyle bir yönteme sahip olmamalarıdır.
Zags

9
@Zags: veya datetime.from_date()yapıcı.
jfs

2
@DavidNemeskey: yorumumun cevap verdiği Zags'in yorumunu okuyun. Hangi yöntemlerin var olması gerektiğiyle ilgilidir .
jfs

2
@JFSebastian: Bunu nasıl özlediğimi bilmiyorum ... ve tamamen katılıyorum.
David Nemeskey

7
Hayır, bir tarih tarih saatinin bir alt kümesidir (adında bile). Tarihin datetime olduğu zaman açıktır. Ama diğer taraftan, tarih 24 saat (genellikle) bir bloktur, bu yüzden birçok tarih alabilir. Bir tarihten itibaren hangi tarihler gelirdi? Her zaman 00:00 yapamazsınız, çünkü ya o zaman yoksa, örneğin yaz saati uygulaması atladı. Çok kolay değil #
Dalore

Yanıtlar:


804

Kullanabilirsiniz datetime.combine(date, time); zaman datetime.timeiçin gece yarısına kadar başlatılan bir nesne oluşturursunuz .

from datetime import date
from datetime import datetime

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

79
Teşekkürler. Time () döndürdüğü gerçeği ile birlikte (0,0) Bence bu en temiz çıkıyor:datetime.combine(d, time())
EMP

33
Kodunuzun datetime.time () öğesinin time.time () ile karıştırılmamasına dikkat edin. Nitelikli isimler FTW!
Dustin

8
Evet, iyi bir noktaya değindiniz. Neyse ki, combine (), a dışında time.timeherhangi bir şey veya başka bir şey iletirseniz bir istisna oluşturur datetime.time.
EMP

21
Gece yarısı için datetime.time.min (2.7.1+) veya datetime.min.time () (daha eski python)
larham1

16
İyi bir çözüm, ama ben datetime.min.time () bir 00:00:00 zaman elde etmenin en temiz yolu olduğunu sanmıyorum. Çünkü yaptığı ilk önce datetime tarafından temsil edilen minimum değeri almak ve sonra zaman bileşenini elde etmektir. Bu arada, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = Yok) ve zamanı 00:00:00. Ancak, açıkça time.min veya time (0, 0, 0, 0) ile 00:00:00 zaman oluşturmak daha temiz olduğunu düşünüyorum.
Florin Dumitrescu

130

Bahsettiğin (ve sevmediğin) en okunabilir olanı olduğuna inanmama rağmen birkaç yol var.

>>> 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)

ve böylece - ama temelde hepsi datenesneden uygun bir şekilde bilgi ayıklamak ve onu uygun ctor veya sınıf fonksiyonuna geri sürmek için menteşelenir datetime.


12
Çok iyi bir nokta. datetime(d.year, d.month, d.day)kabul edilen cevaptan çok daha okunaklı görünüyor datetime.combine(d, datetime.min.time()).
Simon Tewsi

2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)daha temiz görünüyor ( @larham1 tarafından önerildi )
jfs

2
@JF Sebastian: Biraz daha temiz ama cevabında Wes Winham'a katılıyorum, okuyucunun datetime.time.min'in neyi temsil ettiğini bilmesini gerektiriyor. Oysa bana göre datetime(d.year, d.month, d.day)bu daha açık (zaman bileşeni olmayan bir tarih). Yine de küçük bir nokta ve "gece yarısı" gibi bir değişken adı kullanmak, okuyucu neyi datetime.time.mintemsil ettiğini bilmese bile sonucun ne olduğunu açıkça ortaya koyuyor .
Simon Tewsi


76

Kabul edilen cevap doğrudur, ancak kullanmaktan kaçınmayı tercih ederim, datetime.min.time()çünkü tam olarak ne yaptığı bana açık değil. Sizin için açıksa, o zaman daha fazla güç. Aynı şekilde timetupleyöntem ve siparişe güvenme konusunda da aynı şekilde hissediyorum .

Bence, datetimemodül API'sine çok aşina olmak için okuyucuya güvenmeden bunu yapmanın en okunaklı, açık yolu :

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

Bu benim "açık, örtük olmaktan daha iyidir" konusundaki görüşümdür.


Ve orijinal fikir için Kyle Gibson'a şapka ipucu: stackoverflow.com/users/513197/kyle-gibson
Wes Winham

Duygularınıza katılıyorum. Timetuple ve yıldız işaretleri ve min.time () ile ilgili diğer tüm cevaplar araştırma gerektirir ve Python'un tarihleri ​​ve dateleri ele alma şekli, Microsoft'un VBA'da işlem yapma kolaylığına kıyasla zaten biraz hantaldır. Onları bu dilde karma sembollere sarmak kadar basit. Ama konuţuyorum.
Bobort

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)bu cevabın liner fonksiyonu.
aliqandil

Bu işe yarar, ancak datetimesaat dilimi farkında olmanız gerekebilir . Bu durumda, örneğin import pytzekleyebilirsiniz tzinfo=pytz.timezone('Europe/London').
alstr

48

date.timetuple()Yöntemi kullanabilir ve operatörü açabilirsiniz *.

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

3
Bu benim durumum için yararlı. Geçtiğim bir tarih mi yoksa tarih mi bilmiyorum ve hangi sınıf olduğunu kontrol etmek çok pitonik değil. Bu yöntem, hem datetime hem de date nesneleri için çalışacak gibi görünüyor.
Gattster

datetime.combine@ Kiamlaluno'nun cevabını keşfetmeden önce bunu kullanırdım . Bence oldukça pythonic, özellikle bir datetime.timenesne inşa etmek için verilen gibi bir şey gibi görünüyor datetime.time(*map(int,"H:M:S".split(":")))...
Tom

1
Bu benim en sevdiğim cevap
Nam G VU

8

Bugün 2016 olarak, en temiz çözüm pandalar Timestamp tarafından sağlanıyor:

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

Zaman damgası, tarih saatinin pandalarına eşdeğerdir ve çoğu durumda onunla değiştirilebilir. Kontrol:

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

Ancak gerçekten bir vanilya datetime istiyorsanız, yine de yapabilirsiniz:

pd.Timestamp(d).to_datetime()

Zaman damgaları, zaman dilimleri ile uğraşırken diğerlerinin yanı sıra, tarihlerden çok daha güçlüdür. Aslında, Zaman damgaları o kadar güçlü ki çok kötü belgelenmiş olmaları üzücü ...


İyi karar. Buraya geldiğim gibi panda DatetimeIndex sorunu için bir python datetime çözüm gerekir düşündüm. Utanç pandalarının DateIndex kavramı yoktur.
Küçük Bobby Masaları

6
neden 2016 yılında bile sadece datetime manipülasyon yapmak için ağır bir pakete ihtiyacımız var ?!
cowbert

Bunun için pandalar getirmek bir karınca bir çekiç almak gibi
Deji S

5

Henüz belirtilmemiş bir tarihten tarihe dönüştürmenin bir yolu:

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

1
Doğru, ancak ints'ları dizelere ve arkaya dönüştürmek muhtemelen doğrudan ints ile çalışmaktan daha pahalıdır, bu yüzden bunu sadece düşük hacimli işleme için kullanırım
Egor Kraev


-10

Hızlı bir şeye ihtiyacınız varsa, datetime_object.date()datetime nesnesinin tarihini verir.


8
op den gitmek tersini istiyor dateiçin datetime.
Tom

Sorusuna Gönderen: Bunun tersi kolaydır: Bir sahiptir yöntemi. , cesur vurgu benim. datetime.date()
Martijn Pieters

-13

Ben Python'a yeni başladım. Ancak bu kod benim için belirtilen girdi datetime dönüştürür benim için çalıştı. İşte kod. Yanlışsam düzelt.

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

OP bir dize değil , bir datetime.date()nesneye sahiptir .
Martijn Pieters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.