Bagaimana cara mencetak tanggal dalam format reguler?

682

Ini kode saya:

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

Ini mencetak: 2008-11-22itulah yang saya inginkan.

Tapi, saya punya daftar saya menambahkan ini dan kemudian tiba-tiba semuanya berjalan "miring". Ini kodenya:

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

Ini mencetak yang berikut ini:

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

Bagaimana saya bisa mendapatkan kencan sederhana saja 2008-11-22?

NomadAlien
sumber
13
Jawaban singkatnya: Dengan menerapkan str()(ke setiap elemen daftar), karena itulah yang printsecara implisit dilakukan pada todayobjek solo Anda .
Lutz Prechelt

Jawaban:

947

MENGAPA: kurma adalah objek

Dalam Python, kurma adalah objek. Karena itu, ketika Anda memanipulasinya, Anda memanipulasi objek, bukan string, bukan cap waktu atau apa pun.

Objek apa pun di Python memiliki representasi string DUA:

  • Representasi reguler yang digunakan oleh "cetak", bisa menggunakan str()fungsi. Ini adalah format waktu terbanyak yang paling umum digunakan manusia dan digunakan untuk memudahkan tampilan. Jadi str(datetime.datetime(2008, 11, 22, 19, 53, 42))memberimu '2008-11-22 19:53:42'.

  • Representasi alternatif yang digunakan untuk mewakili sifat objek (sebagai data). Ini bisa menggunakan repr()fungsi dan berguna untuk mengetahui data apa yang Anda manipulasi saat Anda sedang mengembangkan atau debugging. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))memberimu 'datetime.datetime(2008, 11, 22, 19, 53, 42)'.

Apa yang terjadi adalah bahwa ketika Anda telah mencetak tanggal menggunakan "cetak", itu digunakan str()sehingga Anda bisa melihat string tanggal yang bagus. Tetapi ketika Anda telah mencetak mylist, Anda telah mencetak daftar objek dan Python mencoba untuk mewakili set data, menggunakan repr().

The How: apa yang ingin Anda lakukan dengan itu?

Nah, ketika Anda memanipulasi tanggal, terus menggunakan objek tanggal sepanjang jalan. Mereka mendapat ribuan metode yang berguna dan sebagian besar API Python mengharapkan tanggal sebagai objek.

Saat Anda ingin menampilkannya, gunakan saja str(). Dalam Python, praktik yang baik adalah secara eksplisit membuang semuanya. Jadi tepat saat waktunya untuk mencetak, dapatkan representasi string dari kencan Anda menggunakan str(date).

Satu hal terakhir. Ketika Anda mencoba untuk mencetak tanggal, Anda mencetak mylist. Jika Anda ingin mencetak tanggal, Anda harus mencetak objek tanggal, bukan wadahnya (daftar).

Misalnya, Anda ingin mencetak semua tanggal dalam daftar:

for date in mylist :
    print str(date)

Perhatikan bahwa dalam kasus khusus itu , Anda bahkan dapat menghilangkan str()karena cetakan akan menggunakannya untuk Anda. Tapi itu seharusnya tidak menjadi kebiasaan :-)

Kasus praktis, menggunakan kode Anda

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

Pemformatan tanggal lanjut

Tanggal memiliki representasi default, tetapi Anda mungkin ingin mencetaknya dalam format tertentu. Dalam hal ini, Anda bisa mendapatkan representasi string khusus menggunakan strftime()metode ini.

strftime() mengharapkan pola string yang menjelaskan bagaimana Anda ingin memformat tanggal Anda.

EG:

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

Semua huruf setelah "%"mewakili format untuk sesuatu:

  • %d adalah nomor hari
  • %m adalah nomor bulan
  • %b adalah singkatan bulan
  • %y adalah tahun dua digit terakhir
  • %Y adalah sepanjang tahun

dll

Lihat dokumentasi resmi , atau referensi cepat McCutchen yang tidak dapat Anda ketahui semuanya.

Sejak PEP3101 , setiap objek dapat memiliki formatnya sendiri yang digunakan secara otomatis oleh format metode string apa pun. Dalam hal datetime, formatnya sama dengan yang digunakan pada strftime. Jadi Anda bisa melakukan hal yang sama seperti di atas seperti ini:

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

Keuntungan dari formulir ini adalah Anda juga dapat mengonversi objek lain secara bersamaan.
Dengan diperkenalkannya string string yang diformat (sejak Python 3.6, 2016-12-23) ini dapat ditulis sebagai

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

Lokalisasi

Tanggal dapat secara otomatis beradaptasi dengan bahasa dan budaya lokal jika Anda menggunakannya dengan cara yang benar, tetapi itu agak rumit. Mungkin untuk pertanyaan lain tentang SO (Stack Overflow) ;-)

e-satis
sumber
3
BTW Hampir setiap jenis data dalam python adalah kelas (kecuali immutables, tetapi mereka dapat subclassed) stackoverflow.com/questions/865911/...
Yauhen Yakimovich
1
Apa maksudmu "hampir"? str dan int memiliki atribut class , yang berisi 'type', karenanya ada kelas sendiri, karena mereka adalah contoh dari tipe metaclass.
e-satis
4
Ini persis pertanyaan terminologi: type! = Class ?, yaitu apakah cukup untuk memiliki atribut type (menyediakan tipe mekanisme inferensi untuk dikualifikasikan untuk suatu objek) atau entitas harus berperilaku sebagai objek. Saya mencoba menyelesaikan ini untuk diri saya sendiri di sini programmer.stackexchange.com/questions/164570/…
Yauhen Yakimovich
1
Jika Anda adalah turunan dari sebuah kelas, Anda adalah sebuah objek. Mengapa Anda membutuhkannya agar lebih rumit?
e-satis
9
Setiap nilai dalam Python adalah objek. Setiap objek memiliki tipe. "type" == "class" secara formal (lihat juga inspect.isclassuntuk memastikan). Orang-orang cenderung mengatakan "ketik" untuk built-in dan "kelas" untuk yang lain, tapi itu tidak penting
Kos
340
import datetime
print datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

Edit:

Setelah saran Cees, saya sudah mulai menggunakan waktu juga:

import time
print time.strftime("%Y-%m-%d %H:%M")
Daniel Magnusson
sumber
6
datetime.datetime?
Cees Timmerman
2
Anda dapat menggunakan dari datetime import datetime, lalu print datetime().now().strftime("%Y-%m-%d %H:%M"). Hanya perbedaan sintaks.
Daniel Magnusson
7
from datetime import date; date.today().strftime("%Y-%m-%d")masih terlihat unpythonic bagi saya, tapi itu yang terbaik tanpa import time. Saya pikir modul datetime adalah untuk matematika tanggal.
Cees Timmerman
2
favorit saya adalah from datetime import datetime as dtdan sekarang kita bisa bermain dengandt.now()
diewland
164

Objek tanggal, waktu, dan waktu semua mendukung metode strftime (format), untuk membuat string yang mewakili waktu di bawah kendali string format eksplisit.

Berikut adalah daftar kode format dengan arahan dan artinya.

    %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.

Inilah yang dapat kita lakukan dengan modul waktu dan modul dengan Python

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

Itu akan mencetak sesuatu seperti ini:

    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
Transformator
sumber
1
Ini menyelesaikan masalah saya di mana "jawaban yang lebih banyak dijumlahkan" tidak. Tapi masalah saya berbeda dari OP. Saya ingin berbulan-bulan dicetak sebagai teks ("Februari" daripada "2")
Nathan
73

Gunakan date.strftime. Argumen pemformatan dijelaskan dalam dokumentasi .

Yang ini yang Anda inginkan:

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

Yang ini memperhitungkan Lokal. (melakukan hal ini)

some_date.strftime('%c')
Ali Afshar
sumber
36

Ini lebih pendek:

>>> import time
>>> time.strftime("%Y-%m-%d %H:%M")
'2013-11-19 09:38'
Cees Timmerman
sumber
26
# 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)

KELUARAN

2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34
Waqas Ali
sumber
25

Atau bahkan

from datetime import datetime, date

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

Keluar: '25 .12.2013

atau

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

Keluar: 'Hari Ini - 25.12.2013'

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

Keluar: 'Rabu'

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

Keluar: '__main ____ 2014.06.09__16-56.log'

b1_
sumber
14

Jawaban sederhana -

datetime.date.today().isoformat()
Api udun
sumber
8

Dengan datetimepemformatan string tipe-spesifik (lihat jawaban nk9 menggunakan str.format().) Dalam string string yang diformat (sejak Python 3.6, 2016-12-23):

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

Tanggal / waktu Format arahan tidak didokumentasikan sebagai bagian dari Format String Sintaks melainkan dalam date, datetimedan time's strftime()dokumentasi. Itu didasarkan pada Standar C 1989, tetapi termasuk beberapa arahan ISO 8601 sejak Python 3.6.

menangani
sumber
Perhatikan bahwa saya juga menambahkan informasi ini ke jawaban yang diterima .
pegang
strftime tidak benar-benar menyertakan "output ISO 8601". Ada "arahan", tetapi hanya untuk token tertentu seperti "hari dalam seminggu", bukan cap waktu ISO 8601 secara keseluruhan, yang menurut saya selalu mengganggu.
anarcat
5

Anda perlu mengonversi objek waktu tanggal ke string.

Kode berikut ini berfungsi untuk saya:

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

Beri tahu saya jika kamu membutuhkan bantuan.

Simon Johnson
sumber
3
Ayolah ! Jangan mendorong pemula untuk menyimpan string, bukan objek tanggal. Dia tidak akan bisa tahu kapan itu ide yang baik atau buruk ...
e-satis
e-satis: Jika yang Anda butuhkan hanyalah sebuah string, apa masalahnya? Kami menyimpan tanggal pembuatan firmware kami sebagai string setiap saat - terkadang menyimpan seluruh objek berlebihan ketika yang Anda butuhkan hanyalah cap waktu sederhana (YAGNI dan semuanya).
HanClinto
3
Ya, dalam kasus tertentu. Maksud saya hanya seorang pemula tidak akan dapat mengidentifikasi kasus-kasus ini. Jadi mari kita mulai dengan kaki kanan :-)
e-satis
4

Saya benci gagasan mengimpor terlalu banyak modul untuk kenyamanan. Saya lebih suka bekerja dengan modul yang tersedia yang dalam hal ini datetimedaripada memanggil modul baru time.

>>> a = datetime.datetime(2015, 04, 01, 11, 23, 22)
>>> a.strftime('%Y-%m-%d %H:%M')
'2015-04-01 11:23'
rickydj
sumber
1
Saya pikir akan lebih efisien untuk melakukan itu dalam satu baris kode dengan melakukana = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore
3

Anda dapat melakukan:

mylist.append(str(today))
Igal Serban
sumber
3

Mengingat fakta bahwa Anda meminta sesuatu yang sederhana untuk melakukan apa yang Anda inginkan, Anda dapat:

import datetime
str(datetime.date.today())
Ward Taya
sumber
3

Bagi mereka yang menginginkan tanggal berbasis lokal dan tidak termasuk waktu, gunakan:

>>> some_date.strftime('%x')
07/11/2019
Liran H
sumber
2

Anda mungkin ingin menambahkannya sebagai string?

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

Karena print todaymengembalikan apa yang Anda inginkan, ini berarti bahwa fungsi objek hari ini __str__mengembalikan string yang Anda cari.

Jadi kamu bisa melakukannya mylist.append(today.__str__())juga.

Ismail Elouafiq
sumber
1

Anda dapat menggunakan easy_date untuk membuatnya mudah:

import date_converter
my_date = date_converter.date_to_string(today, '%Y-%m-%d')
Raphael Amoedo
sumber
1

Penafian cepat atas jawaban saya - Saya baru belajar Python selama sekitar 2 minggu, jadi saya sama sekali tidak ahli; oleh karena itu, penjelasan saya mungkin bukan yang terbaik dan saya dapat menggunakan terminologi yang salah. Bagaimanapun, ini dia.

Saya perhatikan dalam kode Anda bahwa ketika Anda mendeklarasikan variabel today = datetime.date.today()Anda, Anda memilih untuk memberi nama variabel Anda dengan nama fungsi bawaan.

Ketika baris kode berikutnya mylist.append(today)menambahkan daftar Anda, itu menambahkan seluruh stringdatetime.date.today() , yang sebelumnya Anda tetapkan sebagai nilai todayvariabel Anda , bukan hanya menambahkan today().

Sebuah solusi sederhana, walaupun mungkin tidak satu pun kebanyakan coders akan digunakan ketika bekerja dengan modul datetime, adalah mengubah nama variabel Anda.

Inilah yang saya coba:

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

dan itu mencetak yyyy-mm-dd.

Tanda.
sumber
1

Berikut ini cara menampilkan tanggal sebagai (tahun / bulan / hari):

from datetime import datetime
now = datetime.now()

print '%s/%s/%s' % (now.year, now.month, now.day)
Adrian Simon
sumber
1
from datetime import date
def time-format():
  return str(date.today())
print (time-format())

ini akan mencetak 6-23-2018 jika itu yang Anda inginkan :)

Erix
sumber
-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

Dengan cara ini Anda bisa mendapatkan Tanggal diformat seperti contoh ini: 22-Jun-2017

tanmayee
sumber
1
Terlalu banyak kode untuk sesuatu yang bisa Anda dapatkan dalam satu baris. Dengan %bAnda akan mendapatkan kata-kata tiga bulan pertama, dan dengan %Bseluruh bulan. Contoh: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")akan mengembalikan '2018-Okt-04 09:44:08'
Víctor López
-1

Saya tidak sepenuhnya mengerti, tetapi dapat digunakan pandasuntuk mendapatkan waktu dalam format yang tepat:

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

Dan:

>>> 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']

Tapi ini menyimpan string tetapi mudah dikonversi:

>>> l=list(map(str,l))
>>> list(map(pd.to_datetime,l))
[Timestamp('2018-10-07 00:00:00')]
U10-Maju
sumber
4
Seluruh ketergantungan untuk melakukan sesuatu python std library memiliki metode yang harus dilakukan?
Hejazzman