Pythonで日付を日付時刻に変換する


632

Pythonでa dateをa datetimeに変換するための組み込みメソッドはありdatetimeますか?たとえば、指定された日付の真夜中のを取得しますか?逆の変換は簡単です。datetime持っている.date()方法を。

本当に手動で呼び出す必要がありますdatetime(d.year, d.month, d.day)か?


118
ばかげた質問ではありません。日付オブジェクトには.datetime()メソッドが必要です。ばかげたことは、彼らがそのような方法を持っていないということです。
Zags 2013年

9
@Zags:またはdatetime.from_date()コンストラクタ。
jfs

2
@DavidNemeskey:私のコメントが返信するZagsのコメントを読んでください。どのような方法が存在すべきかということです。
jfs

2
@JFSebastian:どうしてそれを逃したかわからない...そして私は完全に同意する。
David Nemeskey、2015年

7
いいえ、日付はdatetimeのサブセットではありません(名前にも含まれています)。日付からの日付が何であるかは明確です。しかし、逆に言えば、日付は24時間(通常)のブロックであるため、多くの日時を持つことができます。日付から何の日時が取得されますか?たとえば夏時間がスキップされた場合など、その時間が存在しない場合はどうなるので、常に00:00にすることはできません。それほど簡単ではありません#
ダロア2017年

回答:


804

使用できますdatetime.combine(date, time)。とりあえず、datetime.time深夜に初期化されたオブジェクトを作成します。

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())

79
ありがとう。time()が(0,0)を返すという事実と組み合わせると、これが最もきれいになると思います:datetime.combine(d, time())
EMP

33
コードがdatetime.time()とtime.time()を混同しないように注意してください。修飾名FTW!
ダスティン

8
はい、良い点です。幸い、combine()は、a time.timeや以外の何かを渡すと例外を発生させますdatetime.time
EMP

21
真夜中の場合、datetime.time.min(2.7.1+)またはdatetime.min.time()(古いpython)のいずれかにPython定数があります
larham1

16
良い解決策ですが、datetime.min.time()が00:00:00時間を取得する最もクリーンな方法だとは思いません。これは、最初に日時で表される最小値を取得してから、その時間コンポーネントを取得するためです。ちなみに、datetime.min = datetime(MINYEAR、1、1、tzinfo = None)であり、時刻は00:00:00です。ただし、time.minまたはtime(0、0、0、0)を使用して00:00:00時間を明示的に作成する方がクリーンだと思います。
Florin Dumitrescu

130

いくつかの方法がありますが、あなたが言及した(そして嫌いな)方法が最も読みやすい方法だと思います。

>>> t=datetime.date.today()
>>> datetime.datetime.fromordinal(t.toordinal())
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(t.year, t.month, t.day)
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(*t.timetuple()[:-4])
datetime.datetime(2009, 12, 20, 0, 0)

など-ただし、基本的にはすべて、dateオブジェクトから適切に情報を抽出し、それを適切なctorまたはのクラス関数に送り込むことに依存していdatetimeます。


12
非常に良い点です。 datetime(d.year, d.month, d.day)受け入れられた答えよりもはるかに読みやすいようですdatetime.combine(d, datetime.min.time())
Simon Tewsi 2014年

2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)きれいに見えます(@larham1により推奨
jfs

2
@JF Sebastian:多少すっきりしていますが、datetime.time.minが何を表しているのかを読者が知る必要があるという彼の回答では、Wes Winhamに同意します。私にdatetime(d.year, d.month, d.day)はそれがより明白であるようです(時間コンポーネントのない日時)。ただし、これは重要な点ではありませんdatetime.time.min。"midnight"のような変数名を使用すると、読み手が何を表しているのかわからなくても、結果がどうなるかが明確になります。
Simon Tewsi 2015年


76

受け入れられた答えは正しいdatetime.min.time()ですが、それが何をするのか私にははっきりしないので、私は使用を避けたいと思います。それがあなたに明らかであるならば、あなたにもっと力があります。timetuple方法や注文への依存についても同じように感じています。

私の意見では、datetimeモジュールAPI に精通しているリーダーに依存せずにこれを行う最も読みやすい明示的な方法は次のとおりです。

from datetime import date, datetime
today = date.today()
today_with_time = datetime(
    year=today.year, 
    month=today.month,
    day=today.day,
)

それは、「明示的なものは暗黙的なものよりも優れている」という私の見解です。


そして、元のアイデアのためのカイルギブソンへの帽子のヒント:stackoverflow.com/users/513197/kyle-gibson
ウェスウィンハム14年

私はあなたの意見に同意します。timetupleとアスタリスクおよびmin.time()を使用したこれらすべての他の回答には調査が必要であり、日付と日時を処理するPythonの方法は、MicrosoftがVBAでそれらを処理するのに比べてとにかく少し面倒です。その言語のハッシュ記号でそれらをラップするのと同じくらい簡単です。しかし、私は余談です。
Bobort 2016年

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)この回答のオンライン機能。
アリカンジル2017年

これは機能しますが、datetimeタイムゾーンを認識する必要がある場合があります。その場合、たとえば、をimport pytz追加してtzinfo=pytz.timezone('Europe/London')から追加できます。
alstr

48

date.timetuple()メソッドとアンパック演算子を使用できます*

args = d.timetuple()[:6]
datetime.datetime(*args)

3
これは私の状況に役立ちます。それが渡されている日付または日付時刻のどちらであるかはわかりません。また、それがどのクラスであるかを確認するのは、それほどpythonicではありません。このメソッドは、datetimeオブジェクトとdateオブジェクトの両方で機能するように見えます。
Gattster

datetime.combine@kiamlalunoの答えを見つける前にこれを使用していました。特にdatetime.timeオブジェクトの構築はdatetime.time(*map(int,"H:M:S".split(":")))とにかく似ているように思われるので、それはかなりpythonicだと思います...
トム

1
これが私のお気に入りの答えです
Nam G VU

8

今日は2016年なので、最もクリーンなソリューションはパンダタイムスタンプによって提供されると思います。

from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)

Timestampは、datetimeに相当するパンダであり、ほとんどの場合それと交換可能です。小切手:

from datetime import datetime
isinstance(pd.Timestamp(d), datetime)

しかし、本当にバニラの日付時刻が必要な場合でも、次のことができます。

pd.Timestamp(d).to_datetime()

タイムスタンプは、特にタイムゾーンを処理する場合、日時よりもはるかに強力です。実際、タイムスタンプは非常に強力なので、ドキュメント化が不十分であるのは残念です...


よかった。私がそれがパンダのDatetimeIndex問題にpython datetimeソリューションを必要とすると思ったので、ここに来ました。Shame pandasには、DateIndexの概念はありません。
リトルボビーテーブル

6
2016年でさえ、日時の操作を行うためだけに重量のあるパッケージが必要なのはなぜですか?
カウバート

これのためにパンダを引き出すことは、ハンマーをアリに連れて行くようなものです
デジS

5

まだ言及されていない日付から日付時刻に変換する1つの方法:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')

1
確かに、しかし、intを文字列に変換して戻すことはおそらく、intを直接操作するよりもコストがかかるため、少量の処理にのみ使用します
Egor Kraev


-10

簡単なものが必要な場合datetime_object.date()は、datetimeオブジェクトの日付を指定します。


8
opはから行くために、反対のことを望んでいるdatedatetime
トム

質問から:逆の変換は簡単です。持っている方法を。、大胆な強調鉱山。datetime.date()
Martijn Pieters

-13

私はPythonの初心者です。しかし、このコードは私が機能し、指定した入力を日時に変換します。これがコードです。私が間違っていたら訂正してください。

import sys
from datetime import datetime
from time import mktime, strptime

user_date = '02/15/1989'
if user_date is not None:
     user_date = datetime.strptime(user_date,"%m/%d/%Y")
else:
     user_date = datetime.now()
print user_date

OPには文字列datetime.date()はなくオブジェクトがあります
Martijn Pieters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.