Chuyển đổi ngày chuỗi thành dấu thời gian trong Python


219

Làm cách nào để chuyển đổi một chuỗi trong định dạng "%d/%m/%Y"sang dấu thời gian?

"01/12/2011" -> 1322697600

Số thứ 2 là gì? Thời đại Unix?
Hasteur

4
@Hururur, vâng. Số thứ hai biểu thị số giây đã trôi qua giữa thời điểm bắt đầu của kỷ nguyên unix và ngày được chỉ định. Định dạng này cũng được gọi là thời gian POSIX.
eikonomega

Câu trả lời:


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

10
nó giả sử nửa đêm 01/12/2011 theo múi giờ địa phương. Nếu đầu vào là UTC; bạn có thể sử dụng calendar.timegm()hoặc.toordinal()
jfs

49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()ngắn hơn một chút
timdiels

11
@timdiels: một lần nữa. .timestamp()giả định giờ địa phương thay vì UTC nếu không có múi giờ rõ ràng được đưa ra. Mã trong câu trả lời chỉ hoạt động (dự kiến ​​sản xuất 1322697600) trên máy tính có múi giờ cục bộ có độ lệch utc bằng không.
jfs

7
điều này không hoạt động: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S"). timestamp () TracBack ( cuộc gọi gần đây nhất vừa qua): Tệp "<stdin>", dòng 1, trong <module> AttributionError: đối tượng 'datetime.datetime' không có thuộc tính 'dấu thời gian'
Zdenek Maxa

5
@ZdenekMaxa datetime.timestamp () chỉ khả dụng cho python> = 3.3 phiên bản. docs.python.org/3/whatsnew/3.3.html
joni jones

48

Tôi sử dụng ciso8601, nhanh hơn 62 lần so với thời gian của datetime.

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

Bạn có thể tìm hiểu thêm ở đây .


2
đây là một gợi ý tuyệt vời tôi chỉ sử dụng nó và cạo TẤN thời gian khỏi sự hành quyết của tôi.
David

3
Chúa ơi chuyện này nhanh quá
Hews 23/12/18

3
Và +1 vì không cần tôi đánh vần định dạng chuỗi thời gian là gì.
gowenfawr

40

Để chuyển đổi chuỗi thành một đối tượng ngày:

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

Cách chuyển đổi đối tượng ngày thành dấu thời gian POSIX phụ thuộc vào múi giờ. Từ Chuyển đổi datetime.datesang dấu thời gian UTC trong Python :

  • đối tượng ngày đại diện cho nửa đêm trong UTC

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • đối tượng ngày đại diện cho nửa đêm trong giờ địa phương

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

Dấu thời gian là khác nhau trừ khi nửa đêm ở UTC và theo giờ địa phương là cùng thời gian.


Khi tôi chạy các ví dụ trong bài viết này, tôi gặp lỗi : NameError: name 'wckCalendar' is not defined. Tôi đang chạy Python 3.4.1 trên máy Windows 32 bit. Bất kỳ ý tưởng? Cảm ơn.
sedeh

1
@sedeh không có wckCalWiki trong bài viết. Kiểm tra mã của bạn.
jfs

@JFSebastian Chính xác, và tôi đã không cố gọi trực tiếp cho wckCalWiki. Nó chỉ hiển thị trong thông báo lỗi. Xem bài viết của tôi ở đây thảo luận về vấn đề.
sedeh

1
@ törzsmókus: Nếu câu trả lời là sai, thì nó không quan trọng đến mức nào.
jfs

1
@ törzsmókus: nhìn vào câu trả lời của tôi: nó có thể tạo ra hai số khác nhau. Câu trả lời của bạn tạo ra một số mà không đề cập đến số nào.
jfs


21

Câu trả lời cũng phụ thuộc vào múi giờ ngày đầu vào của bạn. Nếu ngày của bạn là một ngày địa phương, thì bạn có thể sử dụng mktime () như katrielalex đã nói - chỉ tôi không thấy lý do tại sao anh ấy sử dụng datetime thay vì phiên bản ngắn hơn này:

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

Nhưng hãy quan sát rằng kết quả của tôi khác với anh ấy, vì tôi có thể ở một TZ khác (và kết quả là dấu thời gian UNIX không có múi giờ)

Bây giờ nếu ngày đầu vào đã có trong UTC, tôi tin rằng giải pháp phù hợp là:

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

Tôi nghĩ rằng điều này là tốt hơn. Không cần nhập cả 'thời gian' và 'thời gian'.
kennyut

17

Đơn giản chỉ cần sử dụng datetime.datetime.strptime:

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

Kết quả:

1322697600

Để sử dụng UTC thay vì múi giờ địa phương, hãy sử dụng .replace:

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

Đối với một anwser hoàn chỉnh, bạn phải nói rằng nó chỉ hợp lệ cho python 3.3+
Eduardo

Trong ví dụ đầu tiên, kết quả là floatkhôngint
CONvid19

6

Trước tiên, bạn phải lớp strptime để chuyển đổi chuỗi thành định dạng struct_time.

Sau đó, chỉ cần sử dụng mktime từ đó để có được float của bạn.


6

Rất nhiều câu trả lời không bận tâm để xem xét rằng ngày bắt đầu là ngây thơ

Để chính xác, trước tiên bạn cần đặt ngày ngây thơ thành một mốc thời gian nhận biết múi giờ

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

Cũng thế:

Hãy cẩn thận, sử dụng pytzcho tzinfomột datetime.datetimecông việc không nhiều múi giờ. Xem datetime với múi giờ pytz. Độ lệch khác nhau tùy thuộc vào cách đặt 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

Tôi muốn đề xuất dateutil :

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

Đó là sai. OP mong đợi thời gian ở "%d/%m/%Y"định dạng. So sánh: dateutil.parser.parse("01/02/2001")datetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

cảm ơn @jfs, bắt tốt Tôi cập nhật câu trả lời của tôi cho phù hợp. (với tư cách là người không phải là người Mỹ, tôi sẽ không nghĩ định dạng M / D / Y phi logic là mặc định cho trình phân tích cú pháp.)
törzsmókus

1
nó không tạo ra sự mong đợi 1322697600trừ khi múi giờ địa phương của bạn là UTC. Xem bình luận của tôi từ 2014
jfs

4

Có vẻ là khá hiệu quả:

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

1,61 Khen ± 120 ns mỗi vòng lặp (trung bình ± std. Dev của 7 lần chạy, mỗi vòng 100000)


Là gì datetimechức năng? datetimetừ datetimethư viện không hỗ trợ.timestamp()
Joooeey

@Joooeey: Nó, trên Python 3.3 trở lên . Không có sẵn khi câu hỏi được đăng, nhưng nó đã có sẵn từ tháng 9 năm 2012.
ShadowRanger

0

chỉ cần sử dụng datetime.timestamp (instetime instanse của bạn), thể hiện datetime chứa thông tin múi giờ, do đó dấu thời gian sẽ là dấu thời gian utc tiêu chuẩn. nếu bạn chuyển đổi datetime thành timetuple, nó sẽ mất múi giờ, do đó, kết quả sẽ là lỗi. nếu bạn muốn cung cấp một giao diện, bạn nên viết như thế này: int (datetime.timestamp (time_instance)) * 1000



0

bạn có thể chuyển đổi sang 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

Một chức năng đơn giản để có được thời gian Epoch UNIX.

LƯU Ý : Hàm này giả sử thời gian ngày đầu vào ở định dạng UTC (Tham khảo ý kiến tại đây).

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

Cách sử dụng :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.