แปลงวันที่ของสตริงเป็นการประทับเวลาใน Python


220

วิธีแปลงสตริงในรูปแบบ"%d/%m/%Y"เป็นเวลาประทับ?

"01/12/2011" -> 1322697600

หมายเลขที่สองคืออะไร เวลา Unix ยุค?
Hasteur

4
@Hastur ใช่ ตัวเลขที่สองแสดงจำนวนวินาทีที่ผ่านไปแล้วระหว่างจุดเริ่มต้นของ unix epoch และวันที่ที่ระบุ รูปแบบนี้เรียกอีกอย่างว่าเวลา POSIX
eikonomega

คำตอบ:


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

10
จะถือว่าเที่ยงคืน 01/12/2011 ในเขตเวลาท้องถิ่น หากอินพุตอยู่ใน UTC คุณสามารถใช้calendar.timegm()หรือ.toordinal()
jfs

50
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()สั้นลงเล็กน้อย
timdiels

11
@timdiels: อีกครั้ง .timestamp()ใช้เวลาท้องถิ่นแทน UTC หากไม่มีการกำหนดเขตเวลาที่ชัดเจน รหัสในคำตอบใช้งานได้ (สร้างตามที่คาดหวัง1322697600) เฉพาะในคอมพิวเตอร์ที่เขตเวลาท้องถิ่นมีออฟเซ็ตเป็นศูนย์ utc
jfs

7
สิ่งนี้ใช้ไม่ได้: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S") timestamp () Traceback () การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<stdin>", บรรทัด 1, ใน <module> AttributeError: วัตถุ 'datetime.datetime' ไม่มีแอตทริบิวต์ 'timestamp'
Zdenek Maxa

5
@ZdenekMaxa datetime.timestamp () พร้อมใช้งานสำหรับ python> = 3.3 เวอร์ชั่นเท่านั้น docs.python.org/3/whatsnew/3.3.html
jones

48

ฉันใช้ciso8601ซึ่งเร็วกว่าสเปซไทม์ของวันที่ 62 เท่า

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

คุณสามารถเรียนรู้เพิ่มเติมที่นี่


2
นี่เป็นคำแนะนำที่น่าอัศจรรย์ ฉันเพิ่งใช้มันและโกน TONS ของเวลาออกจากการดำเนินการของฉัน
David

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.dateเป็นเวลา UTC ใน Python :

  • วัตถุวันที่แสดงถึงเที่ยงคืนใน UTC

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • วัตถุวันที่แสดงถึงเที่ยงคืนในเวลาท้องถิ่น

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

การประทับเวลาจะแตกต่างกันเว้นแต่เที่ยงคืนใน UTC และในเวลาท้องถิ่นเป็นอินสแตนซ์เวลาเดียวกัน


NameError: name 'wckCalendar' is not definedเมื่อฉันเรียกตัวอย่างในโพสต์นี้ผมได้รับข้อผิดพลาด: ฉันใช้ Python 3.4.1 บนเครื่อง Windows 32 บิต ความคิดใด ๆ ขอบคุณ
sedeh

1
@sedeh ไม่มี wckCalendar ในโพสต์ ตรวจสอบรหัสของคุณ
jfs

@JFSebastian แน่นอนและฉันไม่ได้พยายามโทร wckCalendar โดยตรง มันเพิ่งปรากฏขึ้นในข้อความข้อผิดพลาด ดูโพสต์ของฉันที่นี่เพื่อหารือเกี่ยวกับปัญหา
sedeh

1
@ törzsmókus: หากคำตอบไม่ถูกต้องไม่สำคัญว่าจะอ่านได้อย่างไร
jfs

1
@ törzsmókus: ดูคำตอบของฉัน: มันอาจสร้างตัวเลขสองตัวที่แตกต่างกัน คำตอบของคุณสร้างหมายเลขหนึ่งโดยไม่พูดถึงหมายเลขใด
jfs

30
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200

10
"%s"ไม่ได้รับการสนับสนุนจากงูใหญ่ มันไม่ได้พกพา
jfs

จำนวนการอ่าน ดูคำตอบของฉันกับ dateutilสำหรับวิธีการแก้ปัญหาที่มนุษย์อ่านได้มากขึ้น
törzsmókus

21

คำตอบขึ้นอยู่กับเขตเวลาของวันที่ที่คุณป้อน หากวันที่ของคุณเป็นวันที่ท้องถิ่นคุณสามารถใช้ mktime () เช่น katrielalex พูดได้ - มีเพียงฉันเท่านั้นที่ไม่เห็นสาเหตุที่เขาใช้วันที่และเวลาแทนรุ่นที่สั้นกว่านี้:

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

ฉันคิดว่ามันดีกว่า ไม่จำเป็นต้องนำเข้าทั้ง 'เวลา' และ 'วันที่'
kennyut

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

ในตัวอย่างแรกผลลัพธ์floatไม่เป็นint
CONvid19

6

ก่อนอื่นคุณต้องก้าวเดินคลาสเพื่อแปลงสตริงเป็นรูปแบบ struct_time

จากนั้นเพียงแค่ใช้mktimeจากที่นั่นเพื่อรับทุ่นของคุณ


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

นอกจากนี้:

ระวังใช้pytzสำหรับtzinfoในdatetime.datetimeไม่ทำงานสำหรับเขตเวลาหลาย ดูวันที่และเวลาด้วย pytz timezone การชดเชยที่แตกต่างกันขึ้นอยู่กับวิธีตั้งค่า 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")และdatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

ขอบคุณ @jfs จับได้ดี ฉันปรับปรุงคำตอบของฉันตาม (ในฐานะที่ไม่ใช่คนอเมริกันฉันคงไม่คิดว่ารูปแบบ M / D / Y ที่ไร้เหตุผลนั้นเป็นค่าเริ่มต้นสำหรับโปรแกรมแยกวิเคราะห์)
törzsmókus

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 ต่อลูป (หมายถึง± std. dev. จาก 7 วิ่ง, 100,000 ลูปแต่ละอัน)


อะไรคือdatetimeฟังก์ชั่น? datetimeจากdatetimeห้องสมุดไม่รองรับ.timestamp()
Joooeey

@Joooeey: มันไม่เกี่ยวกับงูหลาม 3.3 หรือในภายหลัง ไม่สามารถใช้ได้เมื่อมีการโพสต์คำถาม แต่สามารถใช้ได้ตั้งแต่เดือนกันยายน 2012
ShadowRanger

0

เพียงแค่ใช้ datetime.timestamp (อินสแตนซ์ของคุณ datetime), อินสแตนซ์ของ datetime มีข้อมูลเขตเวลาดังนั้นการประทับเวลาจะเป็น utc timestamp มาตรฐาน ถ้าคุณแปลงวันที่และเวลาไปเป็นตารางเวลามันจะสูญเสียเวลาของเขตดังนั้นผลลัพธ์จะผิดพลาด ถ้าคุณต้องการให้อินเทอร์เฟซคุณควรเขียนดังนี้: 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.