Як надрукувати дату у звичайному форматі?


682

Це мій код:

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

Це відбитки: 2008-11-22що саме я хочу.

Але, у мене є список, до якого я додаю це, і раптом все стає «примхливим». Ось код:

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

Це друкує наступне:

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

Як я можу отримати просто просте побачення 2008-11-22?


13
Коротка відповідь: Застосовуючи str()(до кожного елемента списку), адже це саме те, що printнеявно зробило ваш сольний todayоб’єкт.
Lutz Prechelt

Відповіді:


947

ЧОМУ: дати - це об’єкти

У Python дати є об’єктами. Тому, коли ви маніпулюєте ними, ви маніпулюєте об'єктами, а не рядками, а не мітками часу і нічого.

Будь-який об’єкт в Python має ДВОЕ рядкове представлення:

  • Регулярне представлення, яке використовується "print", можна отримати за допомогою str()функції. Це більшість випадків найпоширеніший для людини читаний формат і використовується для полегшення відображення. Так str(datetime.datetime(2008, 11, 22, 19, 53, 42))дає вам '2008-11-22 19:53:42'.

  • Альтернативне подання, яке використовується для представлення природи об'єкта (як даних). Це можна отримати за допомогою repr()функції, і зручно дізнатися, якими даними ви керуєте під час розробки чи налагодження. repr(datetime.datetime(2008, 11, 22, 19, 53, 42))дає тобі'datetime.datetime(2008, 11, 22, 19, 53, 42)' .

Сталося те, що коли ви надрукували дату за допомогою "print", вона використовувалася, str()щоб ви могли побачити гарний рядок дати. Але коли ви надрукувалиmylist , ви надрукували список об’єктів і Python намагався зобразити набір даних, використовуючи repr().

Як: що ти хочеш з цим зробити?

Що ж, коли ви маніпулюєте датами, продовжуйте використовувати об'єкти дат протягом усього шляху. Вони отримали тисячу корисних методів, і більшість API Python очікують, що дати будуть об’єктами.

Коли ви хочете їх відобразити, просто використовуйте str(). У Python найкраща практика полягає у тому, щоб явно все віддати. Тож, коли настає час надрукувати, знайдіть строкове представлення своєї дати за допомогоюstr(date) .

Одне останнє. Коли ви намагалися надрукувати дати, ви надрукували mylist. Якщо ви хочете надрукувати дату, ви повинні надрукувати об'єкти дат, а не їх контейнер (список).

EG, ви хочете надрукувати всю дату у списку:

for date in mylist :
    print str(date)

Зауважте, що в цьому конкретному випадку ви навіть можете пропустити, str()оскільки друк використовуватиме його для вас. Але це не повинно стати звичкою :-)

Практичний випадок, використовуючи ваш код

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

Розширене форматування дати

Дати мають типове зображення, але ви можете роздрукувати їх у певному форматі. У цьому випадку ви можете отримати спеціальне представлення рядків за допомогою strftime()методу.

strftime() очікує шаблон рядка, що пояснює, як ви хочете відформатувати дату.

EG:

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

Весь лист після символу "%"представляє формат для чогось:

  • %d - номер дня
  • %m - номер місяця
  • %b - абревіатура місяця
  • %y - рік, останні дві цифри
  • %Y є цілий рік

тощо

Перегляньте офіційну документацію , або швидку довідку МакКушен, ви не можете їх усіх знати.

Починаючи з PEP3101 , кожен об'єкт може мати власний формат, який автоматично використовується форматом методу будь-якого рядка. У випадку з датою формат буде таким самим, як і у стропіллі. Таким чином, ви можете зробити те саме, що вище, як це:

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

Перевага цієї форми полягає в тому, що ви можете одночасно конвертувати інші об'єкти.
З введенням відформатованих рядкових літералів (з Python 3.6, 2016-12-23) це можна записати як

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

Локалізація

Дати можуть автоматично адаптуватися до місцевої мови та культури, якщо використовувати їх правильно, але це трохи складніше. Можливо, для іншого питання щодо SO (Переповнення стека) ;-)


3
ДО РЕЧІ Майже кожен тип даних в Python клас (крім immutables, але вони можуть бути підкласи) stackoverflow.com/questions/865911 / ...
Євген Якимович

1
Що ви маєте на увазі «майже»? str та int мають атрибут класу , який містить 'type', для цього існують самі класи, оскільки вони є екземплярами метакласу типу.
e-satis

4
Це саме питання термінології: type! = Class?, Тобто достатньо мати атрибут type (надавати механізм виводу типу, щоб бути кваліфікованим для об'єкта) або чи повинна особа вести себе як об'єкт. Я намагаюся вирішити це для себе тут, програмісти.stackexchange.com
questions/164570/…

1
Якщо ви є екземпляром класу, ви є об'єктом. Навіщо вам це потрібно, щоб було складніше?
e-satis

9
Кожне значення Python є об'єктом. Кожен об’єкт має тип. "тип" == "клас" формально (також дивіться, inspect.isclassщоб переконатися). Люди схильні говорити "тип" для вбудованих і "клас" для решти, але це не важливо
Кос

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

Редагувати:

Після пропозиції Cees я також почав використовувати час:

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

6
datetime.datetime?
Cees Timmerman

2
Ви можете використовувати з datetime import datetime, а потім print datetime().now().strftime("%Y-%m-%d %H:%M"). Тільки синтаксична різниця.
Даніель Магнуссон

7
from datetime import date; date.today().strftime("%Y-%m-%d")досі виглядає для мене непітонічно, але це найкраще без import time. Я думаю, що модуль datetime є математикою дати.
Cees Timmerman

2
мій улюблений - from datetime import datetime as dtі зараз ми можемо гратиdt.now()
diewland

164

Об'єкти дати, дати та часу підтримують метод стропінгу (формату), щоб створити рядок, що представляє час під контролем явного формату рядка.

Ось перелік форматних кодів з їх директивою та значенням.

    %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

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

Це надрукує щось подібне:

    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
Це вирішило мою проблему, коли відповіді "більш обґрунтовані" не були. Але моє питання було іншим, ніж ОП. Я хотів, щоб місяці друкувались як текст ("лютий", а не "2")
Натан



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)

ВИХІД

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

25

Або навіть

from datetime import datetime, date

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

Вихід: '.25.2013

або

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

Вихід: "Сьогодні - 25.12.2013"

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

Вихід: "Середа"

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

Вихід: '__основний ____ 2014.06.09__16-56.log'



8

З типовимdatetime форматуванням рядків (див . Відповідь nk9 з використанням str.format().) У форматованому літеральному рядку (з Python 3.6, 2016-12-23):

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

Директиви формат дати / часу не задокументовані як частина формату рядка синтаксису , а в date, datetimeі time«s strftime()документації. Вони базуються на стандарті 1989 C, але містять деякі директиви ISO 8601, починаючи з Python 3.6.


Зауважте, що я також додав цю інформацію до прийнятої відповіді .
обробляти

strroll насправді не включає "вихід ISO 8601". Існують "директиви", але тільки для конкретних маркерів, таких як "день тижня", не ціла мітка часу ISO 8601, яка мене завжди дратувала.
anarcat

5

Потрібно перетворити об’єкт часу дати в рядок.

Наступний код працював для мене:

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

Повідомте мене, якщо вам потрібна ще допомога.


3
Давай ! Не закликайте новачка зберігати рядок замість об’єкта дати. Він не зможе дізнатися, коли це гарна чи погана ідея ...
e-satis

e-satis: Якщо все, що вам потрібно, це струна, у чому полягає велика справа? Ми постійно зберігаємо дати побудови мікропрограмного забезпечення як рядки - іноді зберігання цілого об'єкта є надмірним, коли все, що вам потрібно, - це проста часова марка (YAGNI та всі).
HanClinto

3
Так, у певному випадку це так. Я просто маю на увазі, що лише новачок не зможе виявити ці випадки. Тож почнемо з правої ноги :-)
e-satis

4

Я ненавиджу ідею імпортувати занадто багато модулів для зручності. Я б скоріше працював з наявним модулем, який у цьому випадку є datetime, ніж викликати новий модуль time.

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

1
Я думаю, що було б ефективніше зробити це в одному рядку коду, зробивши цеa = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Доріан Доре


3

Враховуючи той факт, що ви попросили щось просте зробити те, що хотіли, ви могли просто:

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

3

Тим, хто хоче дати на основі локальної дати та не враховує час, використовуйте:

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

2

Ви можете додати його як рядок?

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

2

Оскільки print todayповертається те, що ви хочете, це означає, що об'єкт сьогодні є__str__ функція повертає шуканий рядок.

Тож ви можете зробити mylist.append(today.__str__())і це.



1

Швидкий застереження щодо моєї відповіді - я вивчав Python лише близько 2 тижнів, тому я аж ніяк не експерт; тому моє пояснення може бути не найкращим, і я можу використовувати неправильну термінологію. У будь-якому випадку, ось це.

Я помітив у вашому коді, що коли ви декларували свою змінну, today = datetime.date.today()ви вирішили назвати свою змінну іменем вбудованої функції.

Коли ваш наступний рядок коду mylist.append(today)додав ваш список, він додав весь рядок datetime.date.today(), який ви раніше встановили як значення todayзмінної, а не просто додавання today().

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

Ось що я спробував:

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

і він друкує yyyy-mm-dd.


1

Ось як відобразити дату як (рік / місяць / день):

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

це буде надруковано 6-23-2018, якщо це те, що ти хочеш :)


-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

Таким чином ви можете отримати формат дати, як цей приклад: 22 червня 2017 року


1
Занадто багато коду для чогось, що ви могли отримати в одному рядку. З %bвами ви отримаєте перші три місяці слова, і з %Bцілим місяцем. Приклад: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")повернеться '2018-жовтень-04 09:44:08'
Víctor López

-1

Я не повністю розумію, але можу використовувати pandasдля отримання часу у правильному форматі:

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

І:

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

Але це зберігання рядків, але їх легко конвертувати:

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

4
Ціла залежність зробити щось з бібліотеки python std має методи?
Hejazzman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.