Tarih düzenli biçimde nasıl yazdırılır?


683

Bu benim kodum:

import datetime
today = datetime.date.today()
print(today)

Bu baskı: 2008-11-22tam olarak istediğim şey bu.

Ama bunu eklediğim bir listem var ve sonra aniden her şey "sakat" oluyor. İşte kod:

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print(mylist)

Bu aşağıdakileri yazdırır:

[datetime.date(2008, 11, 22)]

Nasıl basit bir randevuyu nasıl alabilirim 2008-11-22?


13
Kısa cevap: uygulayarak str()bu sadece budur çünkü, (listenin her bir elemanına) printörtülü olarak solo yaptıkları todaynesne.
Lutz Prechelt

Yanıtlar:


948

NEDEN: tarihler nesnedir

Python'da tarihler nesnedir. Bu nedenle, onları manipüle ettiğinizde, nesneleri değil, dizeleri değil, zaman damgalarını veya herhangi bir şeyi manipüle edersiniz.

Python'daki herhangi bir nesnenin İKİ dize temsili vardır:

  • "Yazdır" tarafından kullanılan düzenli gösterim işlevi kullanılarak alınabilir str(). Çoğu zaman insan tarafından okunabilen en yaygın biçimdir ve ekranı kolaylaştırmak için kullanılır. Size str(datetime.datetime(2008, 11, 22, 19, 53, 42))verir '2008-11-22 19:53:42'.

  • Nesne doğasını (veri olarak) temsil etmek için kullanılan alternatif gösterim. Bu repr()işlevi kullanmak olabilir ve geliştirme veya hata ayıklama sırasında ne tür veriler manipüle bilmek bilmek kullanışlıdır. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))verir 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Ne oldu "print" kullanarak tarihi yazdırdığınızda, str()güzel bir tarih dizesi görebilmek için kullanılır . Ancak yazdırdığınızda mylist, bir nesne listesi yazdırdınız ve Python kullanarak veri kümesini temsil etmeye çalıştı repr().

Nasıl: bununla ne yapmak istiyorsun?

Tarihleri ​​değiştirirken, tarih nesnelerini sonuna kadar kullanmaya devam edin. Binlerce faydalı yöntem var ve Python API'sının çoğu tarihlerin nesne olmasını bekliyor.

Onları görüntülemek istediğinizde, kullanın str(). Python'da iyi uygulama her şeyi açıkça ortaya koymaktır. Bu nedenle, yazdırma zamanı geldiğinde, kullanarak tarihinizin dize ile temsil edilen halini alın str(date).

Son bir şey. Tarihleri ​​yazdırmaya çalıştığınızda yazdırdınız mylist. Bir tarih yazdırmak istiyorsanız, tarih nesnelerini kapsayıcılarına (liste) yazdırmamalısınız.

EG, bir listedeki tüm tarihi yazdırmak istiyorsunuz:

for date in mylist :
    print str(date)

O Not bu özel durumda , hatta atlayabilirsiniz str()baskı sizin için kullanacağız çünkü. Ama bu bir alışkanlık olmamalı :-)

Pratik durum, kodunuzu kullanarak

import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22

# It's better to always use str() because :

print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22

print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects

print "This is a new day : " + str(mylist[0]) 
>>> This is a new day : 2008-11-22

Gelişmiş tarih biçimlendirme

Tarihlerin varsayılan bir temsili vardır, ancak bunları belirli bir biçimde yazdırmak isteyebilirsiniz. Bu durumda, strftime()yöntemi kullanarak özel bir dize temsili alabilirsiniz .

strftime() tarihinizi nasıl biçimlendirmek istediğinizi açıklayan bir dize deseni bekler.

ÖRNEĞİN :

print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'

Bir "%"temsilciden sonraki tüm harf , bir şeyin biçimini temsil eder:

  • %d gün numarası
  • %m ay numarası
  • %b ayın kısaltması
  • %y son iki basamaklı yıl
  • %Y bütün yıl

vb

Resmi belgelere veya McCutchen'in hepsini bilmediğiniz hızlı referansına bir göz atın .

PEP3101'den beri her nesnenin, herhangi bir dizenin yöntem biçimi tarafından otomatik olarak kullanılan kendi biçimi olabilir. Tarih-saat durumunda, biçim strftime ile aynıdır. Böylece yukarıdaki gibi aynı şeyi yapabilirsiniz:

print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'

Bu formun avantajı, aynı anda diğer nesneleri de dönüştürebilmenizdir. Biçimlendirilmiş dize değişmezlerinin
tanıtılmasıyla (Python 3.6, 2016-12-23'ten beri) bu şekilde yazılabilir

import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'

yerelleştirme

Tarihler, doğru şekilde kullanırsanız yerel dile ve kültüre otomatik olarak uyum sağlayabilir, ancak biraz karmaşıktır. Belki SO (Stack Overflow) ;-) hakkında başka bir soru için


3
BTW Python'daki hemen hemen her veri türü bir sınıftır (değişmezler hariç, ancak alt sınıflara
ayrılabilir

1
Ne demek "neredeyse"? str ve int , 'type' içeren bir sınıf niteliğine sahiptir, bu nedenle kendileri sınıf vardır, çünkü bunlar metasınıf türünün örnekleridir.
e-satis

4
Bu tam olarak bir terminoloji sorusudur: type! = Class?, Yani type özniteliğine sahip olmak (bir nesne için nitelendirilecek tip çıkarım mekanizması sağlamak) veya varlığın nesne olarak davranması gerekir. Bunu burada kendim için çözmeye çalışıyorum programmers.stackexchange.com/questions/164570/…
Yauhen Yakimovich

1
Bir sınıf örneği iseniz, nesnesiniz demektir. Neden daha karmaşık olması gerekiyor?
e-satis

9
Python'daki her değer bir nesnedir. Her nesnenin bir türü vardır. "type" == "class" biçimini yazın (ayrıca bkz inspect.isclass. emin olun). İnsanlar yerleşikler için "tip" ve geri kalanı için "sınıf" demeye meyillidir, ancak bu önemli değildir
Kos

341
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Düzenle:

Cees önerisinden sonra zamanı da kullanmaya başladım:

import time
print time.strftime("%Y-%m-%d %H:%M")

6
datetime.datetime?
Cees Timmerman

2
'Den datetime import datetimeve sonra' nı kullanabilirsiniz print datetime().now().strftime("%Y-%m-%d %H:%M"). Sadece bir sözdizimi farkı.
Daniel Magnusson

7
from datetime import date; date.today().strftime("%Y-%m-%d")hala bana unpythonic görünüyor, ama bu olmadan en iyisi import time. Bence datetime modülü tarih matematiği içindir.
Cees Timmerman

2
benim favorim from datetime import datetime as dtve şimdi oynayabilirizdt.now()
diewland

165

Tarih, datetime ve saat nesnelerinin tümü, açık bir biçim dizesinin kontrolü altındaki saati temsil eden bir dize oluşturmak için bir strftime (format) yöntemini destekler.

Biçim kodlarının direktifleri ve anlamları ile bir listesi.

    %a  Locales abbreviated weekday name.
    %A  Locales full weekday name.      
    %b  Locales abbreviated month name.     
    %B  Locales full month name.
    %c  Locales appropriate date and time representation.   
    %d  Day of the month as a decimal number [01,31].    
    %f  Microsecond as a decimal number [0,999999], zero-padded on the left
    %H  Hour (24-hour clock) as a decimal number [00,23].    
    %I  Hour (12-hour clock) as a decimal number [01,12].    
    %j  Day of the year as a decimal number [001,366].   
    %m  Month as a decimal number [01,12].   
    %M  Minute as a decimal number [00,59].      
    %p  Locales equivalent of either AM or PM.
    %S  Second as a decimal number [00,61].
    %U  Week number of the year (Sunday as the first day of the week)
    %w  Weekday as a decimal number [0(Sunday),6].   
    %W  Week number of the year (Monday as the first day of the week)
    %x  Locales appropriate date representation.    
    %X  Locales appropriate time representation.    
    %y  Year without century as a decimal number [00,99].    
    %Y  Year with century as a decimal number.   
    %z  UTC offset in the form +HHMM or -HHMM.
    %Z  Time zone name (empty string if the object is naive).    
    %%  A literal '%' character.

Python'daki tarih ve saat modülleriyle yapabileceğimiz budur

    import time
    import datetime

    print "Time in seconds since the epoch: %s" %time.time()
    print "Current date and time: ", datetime.datetime.now()
    print "Or like this: ", datetime.datetime.now().strftime("%y-%m-%d-%H-%M")


    print "Current year: ", datetime.date.today().strftime("%Y")
    print "Month of year: ", datetime.date.today().strftime("%B")
    print "Week number of the year: ", datetime.date.today().strftime("%W")
    print "Weekday of the week: ", datetime.date.today().strftime("%w")
    print "Day of year: ", datetime.date.today().strftime("%j")
    print "Day of the month : ", datetime.date.today().strftime("%d")
    print "Day of week: ", datetime.date.today().strftime("%A")

Bu böyle bir şey yazdırır:

    Time in seconds since the epoch:    1349271346.46
    Current date and time:              2012-10-03 15:35:46.461491
    Or like this:                       12-10-03-15-35
    Current year:                       2012
    Month of year:                      October
    Week number of the year:            40
    Weekday of the week:                3
    Day of year:                        277
    Day of the month :                  03
    Day of week:                        Wednesday

1
Bu, "daha çok oylanan cevaplar" ın olmadığı sorunu çözdü. Ama benim sorun OP'lerden farklıydı. Ayların metin olarak basılmasını istedim ("2" yerine "Şubat")
Nathan

73

Date.strftime kullanın. Biçimlendirme bağımsız değişkenleri belgelerde açıklanmıştır .

Bu istediğin şeydi:

some_date.strftime('%Y-%m-%d')

Bu, Locale'i dikkate alır. (Bunu yap)

some_date.strftime('%c')

36

Bu daha kısa:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'

27
# convert date time to regular format.

d_date = datetime.datetime.now()
reg_format_date = d_date.strftime("%Y-%m-%d %I:%M:%S %p")
print(reg_format_date)

# some other date formats.
reg_format_date = d_date.strftime("%d %B %Y %I:%M:%S %p")
print(reg_format_date)
reg_format_date = d_date.strftime("%Y-%m-%d %H:%M:%S")
print(reg_format_date)

ÇIKTI

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34

25

Ya da

from datetime import datetime, date

"{:%d.%m.%Y}".format(datetime.now())

Çıkan: '25 .12.2013

veya

"{} - {:%d.%m.%Y}".format("Today", datetime.now())

Çıkan: 'Today - 25.12.2013'

"{:%A}".format(date.today())

Çıkan: 'Wednesday'

'{}__{:%Y.%m.%d__%H-%M}.log'.format(__name__, datetime.now())

Çıkan: '__main ____ 2014.06.09__16-56.log'



8

Biçimlendirilmiş dize değişmezinde (Python 3.6, 2016-12-23'ten beri ) türe özgü datetimedize biçimlendirmesiyle (bkz. Nk9'un yanıtını kullanarak str.format(). ):

>>> import datetime
>>> f"{datetime.datetime.now():%Y-%m-%d}"
'2017-06-15'

Tarih / saat biçimi direktifleri kapsamında belgelenmemiş Format Dize sözdizimi , ancak bu özelliği date, datetimeve time'nin strftime()belgelerine. Bunlar 1989 C Standardına dayanmaktadır, ancak Python 3.6'dan bu yana bazı ISO 8601 direktiflerini içermektedir.


Bu bilgiyi kabul edilen yanıta da eklediğimi unutmayın .
işlemek

strftime gerçekten bir "ISO 8601 çıktısı" içermez. "Yönergeler" vardır, ancak her zaman sinir bozucu bulduğum bir ISO 8601 zaman damgası değil, yalnızca "haftanın günü" gibi belirli jetonlar için vardır.
anarcat

5

Tarih saat nesnesini bir dizeye dönüştürmeniz gerekir.

Aşağıdaki kod benim için çalıştı:

import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection

Eğer daha fazla yardıma ihtiyacınız varsa bana bildirin.


3
Haydi ! Yeni başlayan bir kişiyi, tarih nesnesi yerine dize saklamaya teşvik etmeyin. Ne zaman iyi ya da kötü bir fikir olduğunu bilemeyecektir ...
e-satis

e-satis: İhtiyacınız olan tek şey bir ipse, önemli olan nedir? Bellenim oluşturma tarihlerimizi her zaman dizeler olarak saklarız - bazen ihtiyacınız olan tek şey basit bir zaman damgası (YAGNI ve tümü) olduğunda tüm nesneyi saklamak aşırıya kaçar.
HanClinto

3
Evet, bazı durumlarda öyle. Yani sadece bir acemi bu vakaları tanımlayamayacak. O halde sağ ayakla başlayalım :-)
e-satis

4

Kolaylık sağlamak için çok fazla modül içe aktarma fikrinden nefret ediyorum. Bu durumda datetimeyeni bir modül çağırmak yerine mevcut modülle çalışmayı tercih ederim time.

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'

1
Bunu tek bir kod satırında yaparak daha verimli olacağını düşünüyoruma = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore


3

İstediğiniz şeyi yapmak için basit bir şey istediğinizi göz önünde bulundurarak, şunları yapabilirsiniz:

import datetime
str(datetime.date.today())

3

Yerel ayarlara dayalı tarih isteyenler ve saat içermeyenler için şunu kullanın:

>>> some_date.strftime('%x')
07/11/2019

2

Bir dize olarak eklemek isteyebilirsiniz?

import datetime 
mylist = [] 
today = str(datetime.date.today())
mylist.append(today) 
print mylist

2

Yana print todaybugün nesnenin bu aracı istediğini getiri __str__fonksiyonu aradığınız dize döndürür.

Böylece siz de yapabilirsiniz mylist.append(today.__str__()).



1

Cevabım için hızlı bir feragatname - Yaklaşık 2 haftadır Python öğreniyorum, bu yüzden hiçbir şekilde uzman değilim; bu nedenle, açıklamam en iyi olmayabilir ve yanlış terminoloji kullanabilirim. Her neyse, işte gidiyor.

Kodunuzda, değişkeninizi bildirdiğinizde, değişkeninizi today = datetime.date.today()yerleşik bir işlevin adıyla adlandırmayı seçtiğinizi fark ettim .

Bir sonraki kod satırınız mylist.append(today)listenize eklendiğinde, yalnızca eklemek yerine daha önce değişkeninizin datetime.date.today()değeri olarak ayarladığınız dizenin tamamını ekledi .todaytoday()

Basit bir çözüm, belki de çoğu kodlayıcının datetime modülü ile çalışırken kullanamayacağı kadar değişkeninizin ismini değiştirmektir.

İşte denedim:

import datetime
mylist = []
present = datetime.date.today()
mylist.append(present)
print present

ve yazdırır yyyy-mm-dd.


1

Tarihin nasıl görüntüleneceği (yıl / ay / gün):

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)

1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

İstediğiniz buysa bu 6-23-2018 yazdıracaktır :)


-1
import datetime
import time

months = ["Unknown","January","Febuary","Marchh","April","May","June","July","August","September","October","November","December"]
datetimeWrite = (time.strftime("%d-%m-%Y "))
date = time.strftime("%d")
month= time.strftime("%m")
choices = {'01': 'Jan', '02':'Feb','03':'Mar','04':'Apr','05':'May','06': 'Jun','07':'Jul','08':'Aug','09':'Sep','10':'Oct','11':'Nov','12':'Dec'}
result = choices.get(month, 'default')
year = time.strftime("%Y")
Date = date+"-"+result+"-"+year
print Date

Bu şekilde Tarih'i şu örnek gibi biçimlendirebilirsiniz: 22-Haziran-2017


1
Bir satırda alabileceğiniz bir şey için çok fazla kod. İle %bsize ilk üç aylık kelimeleri almak ve birlikte olacaktır %Btüm ay. Örnek: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")'2018-Ekim-04 09:44:08' geri dönecek
Víctor López

-1

Ben tam olarak anlamıyorum ama, pandasdoğru biçimde zaman almak için kullanabilirsiniz :

>>> import pandas as pd
>>> pd.to_datetime('now')
Timestamp('2018-10-07 06:03:30')
>>> print(pd.to_datetime('now'))
2018-10-07 06:03:47
>>> pd.to_datetime('now').date()
datetime.date(2018, 10, 7)
>>> print(pd.to_datetime('now').date())
2018-10-07
>>> 

Ve:

>>> l=[]
>>> l.append(pd.to_datetime('now').date())
>>> l
[datetime.date(2018, 10, 7)]
>>> map(str,l)
<map object at 0x0000005F67CCDF98>
>>> list(map(str,l))
['2018-10-07']

Ancak dizeleri saklıyor ancak dönüştürmesi kolay:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]

4
Bir şey yapmak için bütün bağımlılık python std kütüphane yapmak için yöntemler var mı?
Hejazzman
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.