Как напечатать дату в обычном формате?


683

Это мой код:

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объектом.
Лутц Пречелт

Ответы:


949

ПОЧЕМУ: даты являются объектами

В 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. Если вы хотите напечатать дату, вы должны напечатать объекты даты, а не их контейнер (список).

Например, вы хотите напечатать всю дату в списке:

for date in mylist :
    print str(date)

Обратите внимание, что в этом конкретном случае вы можете даже опустить, str()потому что print будет использовать его для вас. Но это не должно стать привычкой :-)

Практический пример использования вашего кода

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 , каждый объект может иметь свой собственный формат, автоматически используемый форматом метода любой строки. В случае даты и времени формат тот же, что и в strftime. Таким образом, вы можете сделать то же, что и выше, как это:

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 - это класс (кроме неизменяемых, но они могут быть разделены на подклассы) stackoverflow.com/questions/865911/…
Евгений Якимович

1
Что значит "почти"? У str и int есть атрибут класса , который содержит «тип», поэтому существуют сами классы, поскольку они являются экземплярами метакласса типа.
E-Удовлетворение

4
Это как раз вопрос терминологии: type! = Class?, То есть достаточно ли иметь атрибут type (предоставить механизм вывода типа для квалификации для объекта) или объект должен вести себя как объект. Я пытаюсь решить эту проблему для себя здесь programmers.stackexchange.com/questions/164570/…
Евгений Якимович

1
Если вы экземпляр класса, вы - объект. Зачем вам это должно быть сложнее?
Э-Удовлетворение

9
Каждое значение в Python является объектом. У каждого объекта есть тип. "type" == "class" формально (см. также, inspect.isclassчтобы убедиться). Люди обычно говорят «тип» для встроенных модулей и «класс» для остальных, но это не важно
Кос

341
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?
Сис Тиммерман

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 предназначен для математики даты.
Сис Тиммерман

2
мой любимый, from datetime import datetime as dtи теперь мы можем играть сdt.now()
diewland

165

Все объекты date, datetime и time поддерживают метод strftime (format) для создания строки, представляющей время под контролем явной строки формата.

Вот список кодов формата с их директивой и значением.

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

Это то, что мы можем сделать с модулями datetime и time в 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.12.2013

или

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

Выход: «Сегодня - 25.12.2013»

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

Out: «среда»

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

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



8

С datetimeформатным форматированием строки (см . Ответ nk9, используя str.format().) В строковом литерале Formatted (начиная с Python 3.6, 2016-12-23):

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

Директивы формат даты / времени не документированы как часть формата строки синтаксиса , а в date, datetimeи time«s strftime()документации. Они основаны на стандарте C 1989 года, но содержат некоторые директивы ISO 8601 начиная с Python 3.6.


Обратите внимание, что я также добавил эту информацию к принятому ответу .
обрабатывать

strftime на самом деле не включает «вывод ISO 8601». Существуют «директивы», но только для определенных токенов, таких как «день недели», а не целая временная метка ISO 8601, которая меня всегда раздражала.
Анаркат

5

Вам необходимо преобразовать объект даты и времени в строку.

Следующий код работал для меня:

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

Дайте мне знать, если вам нужна дополнительная помощь.


3
Давай ! Не поощряйте новичка хранить строку вместо объекта даты. Он не сможет знать, когда это хорошая или плохая идея ...
e-satu

Э-сат: Если все, что вам нужно, это строка, в чем дело? Мы постоянно храним даты сборки прошивки в виде строк - иногда сохранение целого объекта является излишним, когда все, что вам нужно, это простая отметка времени (YAGNI и все).
HanClinto

3
Да, в определенном случае это так. Я просто имею в виду, что только новичок не сможет определить эти случаи. Итак, начнем с правой ноги :-)
e-удовлетворительно

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

Простое решение, хотя, возможно, не самое подходящее для работы с модулем datetime, это изменение имени вашей переменной.

Вот что я попробовал:

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


1
Слишком много кода для чего-то, что вы можете получить в одной строке. С %bвами получат первые три месяца слова, причем со %Bвсего месяца. Пример: datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")вернется '2018-Oct-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.