关于python:如何以特定格式输出日期?

How to print a date in a regular format?

这是我的代码:

1
2
3
import datetime
today = datetime.date.today()
print today

这张照片是:2008-11-22,这正是我想要的,但是……我有一个列表,我把它附加在上面,然后突然一切都变得"不稳定"。代码如下:

1
2
3
4
5
import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist

打印以下内容:

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

我到底怎么才能得到一个简单的约会,比如"2008-11-22"?


为什么:日期是对象

在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)'

发生的是,当您使用"打印"打印日期时,它使用str(),这样您就可以看到一个很好的日期字符串。但是,当您打印了mylist之后,您已经打印了一个对象列表,而python试图使用repr()来表示数据集。

怎么办:你想怎么办?

好吧,当您操作日期时,请一直使用日期对象。他们有上千种有用的方法,而大多数python API都希望日期是对象。

当您想显示它们时,只需使用str()。在Python中,好的做法是显式地强制转换所有内容。所以,就在打印的时候,使用str(date)获得日期的字符串表示。

最后一件事。当您试图打印日期时,您打印了mylist。如果要打印日期,必须打印日期对象,而不是其容器(列表)。

例如,您要在列表中打印所有日期:

1
2
for date in mylist :
    print str(date)

请注意,在这种特定情况下,您甚至可以省略str(),因为print将为您使用它。但它不应该成为一种习惯。

实际案例,使用您的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()需要一个字符串模式来解释如何设置日期格式。

例如:

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

"%"后面的所有字母都代表某种格式:

  • %d为日数
  • %m是月份号
  • %b是月份的缩写。
  • %y是最后两位数的年份。
  • %y为全年

看一看官方文件,或者麦考肯的快速参考文件,你不可能完全了解它们。

自PEP3101以来,每个对象都可以有自己的格式,由任何字符串的方法格式自动使用。对于日期时间,格式与STRFTIME。所以你可以这样做:

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

此表单的优点是您还可以同时转换其他对象。随着格式化字符串文字的引入(自python 3.6,2016-12-23以来),这可以写成

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

国产化

如果你使用正确的方式,日期可以自动适应当地的语言和文化,但这有点复杂。可能是关于so的另一个问题(堆栈溢出);-)


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

编辑:

在CEES建议之后,我也开始使用时间:

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


日期、日期时间和时间对象都支持strftime(format)方法,在显式格式控制下创建表示时间的字符串字符串。

这是一个格式代码列表,其中包含它们的指令和含义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    %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中的日期时间和时间模块做的事情。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    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")

它将打印出如下内容:

1
2
3
4
5
6
7
8
9
10
    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

使用date.strftime。格式化参数在文档中进行了描述。

这是你想要的:

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

这个方法考虑了区域设置。(这样做)

1
some_date.strftime('%c')


这是较短的:

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

1
2
3
4
5
6
7
8
9
10
11
# 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)

OUTPUT

1
2
3
2016-10-06 01:21:34 PM
06 October 2016 01:21:34 PM
2016-10-06 13:21:34


甚至

1
2
3
from datetime import datetime, date

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

2013年12月25日

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

out:'今天-2013年12月25日'

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

out:'星期三'

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

输出:"主日志2014.06.09"


简单答案

1
datetime.date.today().isoformat()

在格式化字符串文字(自python 3.6,2016-12-23以来)中使用特定于类型的datetime字符串格式(请参见nk9使用str.format()的回答):

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

日期/时间格式指令不作为格式字符串语法的一部分记录,而是记录在datedatetimetimestrftime()文档中。它们基于1989 C标准,但包含了一些自Python3.6以来的ISO 8601指令。


您需要将日期时间对象转换为字符串。

以下代码适用于我:

1
2
3
4
5
import datetime
collection = []
dateTimeString = str(datetime.date.today())
collection.append(dateTimeString)
print collection

如果你还需要帮助,请告诉我。


你可以做到:

1
mylist.append(str(today))

您可能想将其附加为字符串?

1
2
3
4
5
import datetime
mylist = []
today = str(datetime.date.today())
mylist.append(today)
print mylist

由于print today返回您想要的内容,这意味着今天对象的__str__函数返回您要查找的字符串。

所以你也可以做mylist.append(today.__str__())


我讨厌为了方便而导入太多模块的想法。我更愿意使用可用的模块,在本例中是datetime,而不是调用一个新的模块time

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


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

如果您愿意的话,这将于2018年6月23日印刷。


考虑到你要求做一些简单的事情,你可以:

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

我不完全理解,但可以使用pandas以正确的格式获得时间:

1
2
3
4
5
6
7
8
9
10
>>> 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
>>>

还有:

1
2
3
4
5
6
7
8
>>> 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']

但它存储字符串,但易于转换:

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


您可以使用简单的日期来简化:

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

以下是如何将日期显示为(年/月/日):

1
2
3
4
from datetime import datetime
now = datetime.now()

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


我的答案很快就免责了——我只学了大约2周的Python,所以我绝对不是专家;因此,我的解释可能不是最好的,我可能会使用不正确的术语。不管怎样,这就是问题所在。

我在代码中注意到,当您声明变量today = datetime.date.today()时,您选择用内置函数的名称命名变量。

当您的下一行代码mylist.append(today)附加了您的列表时,它附加了整个字符串datetime.date.today(),您以前将其设置为today变量的值,而不是只附加today()

一个简单的解决方案是更改变量的名称,尽管大多数编码人员在使用datetime模块时可能不会使用它。

以下是我的尝试:

1
2
3
4
5
import datetime
mylist = []
present = datetime.date.today()
mylist.append(present)
print present

它打印了yyyy-mm-dd


1
2
3
4
5
6
7
8
9
10
11
12
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

这样,您就可以得到日期格式,例如:2017年6月22日