これが私のコードです:
import datetime
today = datetime.date.today()
print(today)
これは次のように印刷されます:2008-11-22
これはまさに私が望んでいるものです。
しかし、これを追加するリストがあり、突然すべてが「おかしくなります」。コードは次のとおりです。
import datetime
mylist = [datetime.date.today()]
print(mylist)
これは を出力します[datetime.date(2008, 11, 22)]
。 のような単純な日付を取得するにはどうすればよいでしょうか2008-11-22
?
ベストアンサー1
理由: 日付はオブジェクトである
Python では、日付はオブジェクトです。したがって、日付を操作するときは、文字列やタイムスタンプではなく、オブジェクトを操作することになります。
Python のオブジェクトには 2 つの文字列表現があります。
で使用される通常の表現は、関数
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()
。
方法: それを使って何をしたいですか?
日付を操作するときは、ずっと日付オブジェクトを使い続けてください。日付オブジェクトには何千もの便利なメソッドがあり、ほとんどの Python API では日付がオブジェクトであると想定されています。
表示したい場合は、 を使用しますstr()
。Python では、すべてを明示的にキャストするのが良い方法です。したがって、印刷するときに、 を使用して日付の文字列表現を取得しますstr(date)
。
最後にもう 1 つ。日付を印刷しようとしたときに、 が印刷されましたmylist
。日付を印刷する場合は、日付オブジェクトのコンテナー (リスト) ではなく、日付オブジェクトを印刷する必要があります。
例えば、リスト内のすべての日付を印刷したいとします:
for date in mylist :
print str(date)
この特定のケースでは、printstr()
が代わりに使用するので省略することもできます。ただし、習慣にしてはいけません :-)
コードを使用した実際のケース
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()
日付をどのようにフォーマットするかを説明する文字列パターンが必要です。
例:
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
a の後の文字はすべて"%"
何かの形式を表します。
%d
日の番号(2桁、必要に応じて先頭にゼロが付く)%m
月の数字(2桁、必要に応じて先頭にゼロが付く)%b
月の略語(3文字)%B
月の名前のフルネーム(文字)%y
年号の省略形(最後の2桁)%Y
年号は完全(4桁)です
等
公式ドキュメントをご覧ください、 またはマカッチェンのクイックリファレンスすべてを知ることはできません。
以来ペップ3101、すべてのオブジェクトは、任意の文字列の format メソッドによって自動的に使用される独自のフォーマットを持つことができます。datetime の場合、フォーマットは 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) の別の質問で取り上げるかもしれません ;-)