Pythonで文字列の日付をタイムスタンプに変換する


219

形式の文字列"%d/%m/%Y"をタイムスタンプに変換する方法は?

"01/12/2011" -> 1322697600

2番目の数字は何ですか?Unixエポック時間?
Hasteur 2012年

4
@Hasteur、はい。2番目の数値は、UNIXエポックの始まりと指定された日付の間に経過した秒数を表します。この形式はPOSIX時間とも呼ばれます。
eikonomega 2013年

回答:


316
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0

10
2011年12月1日の午前0時をローカルタイムゾーンと想定しています。入力がUTCの場合、あなたは使用することができますcalendar.timegm().toordinal()
JFS

49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()少し短い
timdiels 2014

11
@timdiels:もう一度。明示的なタイムゾーンが指定されていない場合、UTCではなく現地時間を.timestamp()想定します。回答のコードは、ローカルタイムゾーンのUTCオフセットがゼロのコンピューターでのみ機能します(予期されるを生成します)。1322697600
jfs 14年

7
これは機能しません:datetime.datetime.strptime( "2014:06:28 11:53:21"、 "%Y:%m:%d%H:%M:%S")。timestamp()トレースバック(最新の呼び出しの最後):ファイル "<stdin>"、1行目<モジュール> AttributeError: 'datetime.datetime' object has no attribute 'timestamp'
Zdenek Maxa

5
@ZdenekMaxa datetime.timestamp()は3.3バージョン以降のPythonでのみ使用できます。docs.python.org/3/whatsnew/3.3.html
joni jones

48

ciso8601はdatetimeのstrptimeより62倍速いを使用しています。

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

詳細については、こちらをご覧ください


2
これは素晴らしい提案です。私はそれを使用して、実行の時間を大幅に削減しました。
デビッド

3
私の神、これは速いです
Hews

3
+1は、時間文字列の形式を詳しく説明する必要がないためです。
gowenfawr

40

文字列を日付オブジェクトに変換するには:

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()

日付オブジェクトをPOSIXタイムスタンプに変換する方法は、タイムゾーンによって異なります。以下からの変換datetime.datePythonでUTCタイムスタンプに

  • 日付オブジェクトはUTCの午前0時を表します

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • 日付オブジェクトは現地時間の午前0時を表します

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())

UTCと現地時間の午前0時が同じ時間インスタンスでない限り、タイムスタンプは異なります。


この投稿の例を実行すると、エラーが発生しますNameError: name 'wckCalendar' is not defined。Windows 32ビットマシンでPython 3.4.1を実行しています。何か案が?ありがとう。
セデー

1
@sedeh投稿にwckCalendarはありません。コードを確認してください。
jfs 2014

@JFSebastianそのとおり、私はwckCalendarを直接呼び出そうとしていませんでした。エラーメッセージに表示されるだけです。問題について議論する私の投稿をここで参照してください。
sedeh 2014

1
@törzsmókus:答えが間違っていても、どれほど読みやすいかは問題ではありません。
JFS

1
@törzsmókus:私の答えを見てください。2つの異なる数値が生成される可能性があります。あなたの答えは、どれに言及することなく1つの数を生み出します。
jfs '18


21

答えは、入力した日付のタイムゾーンにも依存します。あなたの日付がローカル日付の場合、katrielalexが言ったようにmktime()を使用できます-彼がこの短いバージョンの代わりにdatetimeを使用した理由がわかりません:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

しかし、私はおそらく別のTZにいるため、私の結果は彼の結果とは異なることに注意してください(結果はタイムゾーンのないUNIXタイムスタンプです)

入力日付がすでにUTCである場合、正しい解決策は次のとおりです。

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600

これがいいと思います。「time」と「datetime」の両方をインポートする必要はありません。
kennyut 2017

17

単に使用するdatetime.datetime.strptime

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

結果:

1322697600

ローカルタイムゾーンの代わりにUTCを使用するには、次を使用します.replace

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()

完全なanwserの場合は、Python 3.3以降でのみ有効であると言う必要があります
Eduardo

最初の例では、結果はfloatnotint
CONvid19


6

これらの答えの多くは、日付が最初はナイーブであることを気にすることはありません

正確には、最初にナイーブ日付をタイムゾーン対応の日時にする必要があります

import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)

# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)

# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0

また:

多くのタイムゾーンでDOES N'T WORKでfor を使用するpytz場合tzinfoは注意してくださいdatetime.datetimepytzタイムゾーン付きのdatetimeを参照してください。tzinfoの設定方法に応じて異なるオフセット

# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0, 
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!

# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset

https://en.wikipedia.org/wiki/Local_mean_time


6

私はdateutilをお勧めします

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()

違います。OPは"%d/%m/%Y"形式の時間を期待しています。比較:dateutil.parser.parse("01/02/2001")anddatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

@jfsに感謝します。私はそれに応じて私の答えを更新しました。(非アメリカ人として、私は非論理的なM / D / Y形式がパーサーのデフォルトであるとは思いませんでした。)
törzsmókus'18

1
1322697600ローカルのタイムゾーンがUTCでない限り、期待どおりの結果は得られません。2014年のコメントを
jfs

4

非常に効率的であるようです:

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()

ループあたり1.61 µs±120 ns(7回の実行の平均±標準偏差、それぞれ100000ループ)


datetimeの機能は?ライブラリdatetimeからはdatetimeサポートされていません.timestamp()
Joooeey 2018

@Joooeey:Python 3.3以降では可能です。質問の投稿時には利用できませんでしたが、2012
。– ShadowRanger

0

datetime.timestamp(日時のインスタンス)を使用するだけで、datetimeインスタンスにはタイムゾーン情報が含まれるため、タイムスタンプは標準のutcタイムスタンプになります。日時をタイムタプルに変換すると、タイムゾーンが失われるため、結果はエラーになります。インターフェースを提供したい場合は、次のように記述する必要があります:int(datetime.timestamp(time_instance))* 1000



0

あなたはisoformatに変換することができます

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

-1

UNIXエポック時間を取得する単純な関数。

:この関数は、入力日時がUTC形式であることを前提としています(ここのコメントを参照)。

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

使用法

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.