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


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  Locale’s abbreviated weekday name.
    %A  Locale’s full weekday name.      
    %b  Locale’s abbreviated month name.     
    %B  Locale’s full month name.
    %c  Locale’s 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  Locale’s 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  Locale’s appropriate date representation.    
    %X  Locale’s 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.