日付を通常の形式で印刷する方法は?


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、solo todayオブジェクトに対して暗黙的に行われたものだからです。
Lutz Prechelt 2016

回答:


947

理由:日付はオブジェクトです

Pythonでは、日付はオブジェクトです。したがって、それらを操作するときは、文字列やタイムスタンプなどではなく、オブジェクトを操作します。

Pythonのオブジェクトには、2つの文字列表現があります。

  • 「印刷」で使用される正規表現は、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()

方法:それで何をしたいですか?

日付を操作するときは、ずっと日付オブジェクトを使い続けてください。彼らは何千もの便利なメソッドを取得し、ほとんどのPython APIは日付がオブジェクトであることを期待しています。

それらを表示したい場合は、を使用してくださいstr()。Pythonでは、すべてを明示的にキャストすることをお勧めします。したがって、印刷するときがきたときに、を使用して日付の文字列表現を取得しますstr(date)

最後に一つだけ。日付を印刷しようとすると、が印刷されましたmylist。日付を印刷する場合は、コンテナ(リスト)ではなく、日付オブジェクトを印刷する必要があります。

たとえば、すべての日付をリストに印刷したい場合:

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'

aの後のすべての文字は、"%"何かの形式を表しています。

  • %d 日番号です
  • %m 月番号です
  • %b 月の省略形です
  • %y 下2桁の年です
  • %Y 通年です

公式ドキュメント、またはMcCutchenのクイックリファレンスをご覧ください。すべてを知ることはできないをください。

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(Stack Overflow)に関する別の質問のために;-)


3
ところで、ほとんどのpython内のすべてのデータ型はクラスです(immutables除いては、彼らはサブクラス化することができます)stackoverflow.com/questions/865911/...
Yauhen Yakimovich

1
「ほとんど」とはどういう意味ですか?strとintには、「type」を含むclass属性があります。したがって、メタクラス型のインスタンスであるため、クラス自体も存在します。
e-satis

4
これはまさに用語の問題です:type!= class ?、つまりtype属性(オブジェクトに対して修飾される型推論メカニズムを提供する)を持つか、エンティティがオブジェクトとして動作する必要がありますか?私はここで自分のためにこれを解決しようとしていますprogrammers.stackexchange.com/questions/164570/...
Yauhen Yakimovich

1
あなたがクラスのインスタンスなら、あなたはオブジェクトです。なぜもっと複雑にする必要があるのですか?
e-satis

9
Pythonのすべての値はオブジェクトです。すべてのオブジェクトにはタイプがあります。"type" == "class"を正式に(inspect.isclass確認のために参照)。人々は休息のための組み込み関数のための「タイプ」と「クラス」と言う傾向にあるが、それは重要ではありません
コス

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

編集:

シーズの提案の後、私も時間を使い始めました:

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

6
datetime.datetime
Cees Timmerman、2013年

2
からdatetime import datetime、そしてを使用できますprint datetime().now().strftime("%Y-%m-%d %H:%M")。構文の違いのみ。
Daniel Magnusson 2013年

7
from datetime import date; date.today().strftime("%Y-%m-%d")それでも私にはPythonのように見えませんが、それがなければ最高import timeです。datetimeモジュールは日付計算用だと思います。
Cees Timmerman、2013年

2
私のお気に入りはfrom datetime import datetime as dt今、私たちは一緒に遊ぶことができますdt.now()
diewland

164

日付、日付時刻、および時刻オブジェクトはすべて、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.

これは、Pythonのdatetimeおよびtimeモジュールで実行できることです。

    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
これにより、「賛成多数回答」で解決できなかった私の問題が解決しました。しかし、私の問題はOPとは異なりました。月をテキストとして印刷したかった(「2月」ではなく「2月」)
Nathan



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)

出力

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

アウト:「今日-2013年12月25日」

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

アウト:「水曜日」

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

アウト: '__main ____ 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'

日付/時刻の形式のディレクティブはの一部として文書化されていないフォーマット文字列構文ではなく、中datedatetimetimestrftime()マニュアルを参照してください。これらは1989 C標準に基づいていますが、Python 3.6以降のISO 8601ディレクティブがいくつか含まれています。


この情報も承認された回答に追加したことに注意してください。
ハンドル

strftimeには、実際には「ISO 8601出力」は含まれていません。「ディレクティブ」はありますが、「曜日」のような特定のトークンにのみあり、ISO 8601のタイムスタンプ全体ではありません。
anarcat 2018年

5

日付時刻オブジェクトを文字列に変換する必要があります。

次のコードは私のために働きました:

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

他にサポートが必要な場合はお知らせください。


3
いい加減にして !初心者に日付オブジェクトの代わりに文字列を保存するように勧めないでください。彼はそれが良いアイデアか悪いアイデアかを知ることができません...
e-

e-satis:必要なのが文字列だけの場合、何が問題なのですか?ファームウェアのビルド日付は常に文字列として保存されます。必要なのが単純なタイムスタンプ(YAGNIとすべて)だけである場合、オブジェクト全体を保存するのはやり過ぎです。
HanClinto 2008年

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
それを1行のコードで行う方が効率的だと思いますa = datetime.datetime(2015, 04, 01, 23, 22).strftime('%Y-%m-%d %H:%M)
Dorian Dore


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
1行で取得できるコードが多すぎます。%bあなたが最初の3ヶ月の単語を取得し、となり%B、全体の月。例:datetime.datetime.now().strftime("%Y-%b-%d %H:%M:%S")「2018年10月- 04九時44分08秒」を返します
ビクトル・ロペス

-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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.