แปลงวันที่เป็นวันที่และเวลาใน Python


632

มีวิธีการในตัวสำหรับการแปลง a dateไปเป็นdatetimein Python หรือไม่เช่นรับdatetimeเที่ยงคืนของวันที่กำหนด การแปลงตรงกันข้ามนั้นง่าย: datetimeมี.date()วิธีหนึ่ง

ฉันต้องโทรด้วยตนเองจริง ๆdatetime(d.year, d.month, d.day)หรือไม่


118
ไม่ใช่คำถามโง่ ๆ วัตถุวันที่ควรมี.datetime()วิธีการ; สิ่งที่โง่คือพวกเขาไม่มีวิธีดังกล่าว
Zags

9
@Zags: หรือตัวdatetime.from_date()สร้าง
jfs

2
@DavidNemeskey: อ่านความคิดเห็นของ Zags ที่ความคิดเห็นของฉันตอบกลับไป มันเกี่ยวกับวิธีการที่ควรมีอยู่
jfs

2
@JFSebastian: ฉันไม่รู้ว่าจะทำยังไง ... และฉันก็เห็นด้วยอย่างยิ่ง
David Nemeskey

7
ไม่ไม่ควรเป็นวันที่ที่เป็นส่วนย่อยของวันที่และเวลา (มันเป็นแม้กระทั่งในชื่อ) มันชัดเจนว่าวันที่มาจากวันที่และเวลา แต่อีกวิธีหนึ่งรอบวันที่เป็นบล็อก 24 ชั่วโมง (ปกติ) ดังนั้นจึงสามารถมีชุดข้อมูลจำนวนมาก วันที่และเวลาจะมาจากวันใด คุณไม่สามารถเป็นเช่นนั้นได้ตลอดเวลา 00:00 น. เพราะจะเกิดอะไรขึ้นถ้าไม่มีเวลาดังกล่าวตัวอย่างเช่นการประหยัดเวลากลางวันข้ามไป ไม่ใช่เรื่องง่าย # #
dalore

คำตอบ:


804

คุณสามารถใช้datetime.combine(date, time); สำหรับเวลาที่คุณสร้างdatetime.timeวัตถุเริ่มต้นถึงเที่ยงคืน

from datetime import date
from datetime import datetime

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

79
ขอบคุณ บวกกับความจริงที่ว่าเวลาที่ผลตอบแทน () (0,0) ฉันคิดว่านี้ออกมาสะอาด:datetime.combine(d, time())
EMP

33
เพียงระวังอย่าให้โค้ดของคุณได้รับ datetime.time () สับสนกับ time.time () ชื่อที่ผ่านการรับรอง FTW!
ดัสติน

8
ใช่จุดดี โชคดีที่รวม () ทำให้เกิดข้อยกเว้นถ้าคุณผ่านในหรือสิ่งอื่นใดที่นอกเหนือจากtime.time datetime.time
EMP

21
สำหรับเที่ยงคืนจะมีค่าคงที่ของไพ ธ อนที่ datetime.time.min (2.7.1+) หรือ datetime.min.time () (ไพ ธ อนที่เก่ากว่า)
larham1

16
ทางออกที่ดี แต่ฉันไม่คิดว่า datetime.min.time () เป็นวิธีที่สะอาดที่สุดในการรับเวลา 00:00:00 นั่นเป็นเพราะสิ่งที่มันทำคือการดึงค่าต่ำสุดที่สามารถระบุได้โดย datetime และรับส่วนประกอบเวลา อนึ่ง datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) และมีเวลา 00:00:00 อย่างไรก็ตามฉันคิดว่ามันสะอาดกว่าที่จะสร้างเวลา 00:00:00 อย่างชัดเจนตลอดเวลานาทีหรือเวลา (0, 0, 0, 0)
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 ที่เหมาะสมหรือ classfunction datetimeสำหรับ


12
จุดที่ดีมาก datetime(d.year, d.month, d.day)ดูเหมือนจะอ่านได้มากกว่าคำตอบที่ยอมรับdatetime.combine(d, datetime.min.time())ได้
Simon Tewsi

2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)ดูสะอาดขึ้น (แนะนำโดย@larham1 )
jfs

2
@JF Sebastian: มันค่อนข้างสะอาดกว่า แต่ฉันเห็นด้วยกับ Wes Winham ในคำตอบของเขาว่าต้องการให้ผู้อ่านรู้ว่า datetime.time.min หมายถึงอะไร ในขณะที่ฉันดูเหมือนจะdatetime(d.year, d.month, d.day)ชัดเจนมากขึ้น (วันที่และเวลาโดยไม่มีองค์ประกอบเวลา) มันเป็นประเด็นย่อยและการใช้ชื่อตัวแปรเช่น "เที่ยงคืน" ทำให้เห็นได้ชัดว่าผลลัพธ์คืออะไรแม้ว่าผู้อ่านจะไม่ทราบว่าสิ่งใดdatetime.time.minแสดงถึง
Simon Tewsi

4
@SimonTewsi: หมายเหตุ: ไม่ได้เป็นเพียงที่เห็นได้ชัดมากขึ้นก็จะเร็วเกินไปdatetime(d.year, d.mont, d.day)
jfs

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

นั่นคือสิ่งที่ฉันใช้ใน "ชัดเจนดีกว่าโดยปริยาย"


และเป็นหมวกสำหรับ Kyle Gibson สำหรับแนวคิดดั้งเดิม: stackoverflow.com/users/513197/kyle-gibson
Wes Winham

ฉันเห็นด้วยกับความรู้สึกของคุณ คำตอบอื่น ๆ ทั้งหมดที่มี scheduple และ asterisks และ min.time () ต้องการการวิจัยและวิธีการจัดการวันที่และชุดข้อมูลของ Python นั้นค่อนข้างยุ่งยากเมื่อเทียบกับความง่ายที่ Microsoft จัดการกับ VBA มันง่ายเหมือนการห่อหุ้มด้วยสัญลักษณ์แฮชในภาษานั้น แต่ฉันเชือนแช
Bobort

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)ฟังก์ชั่นออนไลเนอร์ของคำตอบนี้
aliqandil

วิธีนี้ใช้ได้ผล แต่คุณอาจจำเป็นต้องdatetimeทราบเขตเวลา ในกรณีนี้คุณสามารถimport pytzและเพิ่มtzinfo=pytz.timezone('Europe/London')เช่น
alstr

48

คุณสามารถใช้วิธีการและผู้ประกอบการแกะdate.timetuple()*

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

3
สิ่งนี้มีประโยชน์สำหรับสถานการณ์ของฉัน ฉันไม่รู้ว่ามันเป็นวันที่หรือวันที่ฉันถูกผ่านไปแล้วและมันก็ไม่ได้เป็น pythonic มากในการตรวจสอบว่าเป็นคลาสใด วิธีนี้ดูเหมือนว่าจะใช้ได้กับทั้งวันที่และเวลาและวัตถุวันที่
Gattster

ฉันเคยใช้สิ่งนี้ก่อนที่จะค้นพบdatetime.combineผ่านคำตอบของ @ kiamlaluno ฉันคิดว่ามันค่อนข้างไพเราะโดยเฉพาะอย่างยิ่งการสร้างdatetime.timeวัตถุมีแนวโน้มที่จะมีลักษณะเช่นdatetime.time(*map(int,"H:M:S".split(":")))นี้ ...
Tom

1
นี่คือคำตอบที่ฉันโปรดปราน
Nam G VU

8

วันนี้เป็นปี 2559 ฉันคิดว่าวิธีแก้ปัญหาที่สะอาดที่สุดมีให้โดย pandas Timestamp:

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

Timestamp คือ pandas เทียบเท่ากับ datetime และสามารถเปลี่ยนได้ในกรณีส่วนใหญ่ ตรวจสอบ:

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

แต่ในกรณีที่คุณต้องการวานิลลา datetime จริงๆคุณยังสามารถทำได้:

pd.Timestamp(d).to_datetime()

การประทับเวลานั้นมีประสิทธิภาพมากกว่าดาต้าไทม์มากกว่าเมื่อเทียบกับเขตเวลาอื่น ๆ ที่จริงแล้ว Timestamps มีประสิทธิภาพมากจนน่าเสียดายที่บันทึกไว้ไม่ดี ...


โทรดีมาก มาที่นี่เพราะฉันคิดว่ามันจะต้องมีวิธีการแก้ปัญหา python datetime ในการ pandas DatetimeIndex ปัญหา Shame pandas ไม่มีแนวคิดของ DateIndex
ตาราง Bobby น้อย

6
ทำไมเราต้องใช้แพ็คเกจเฮฟวี่เวทเพื่อทำการจัดการดาต้าไทม์แม้แต่ในปี 2559!
cowbert

การนำหมีแพนด้ามาทำเช่นนี้เปรียบเสมือนการเอาค้อนไปหามด
Deji S

5

วิธีหนึ่งในการแปลงจากวันที่เป็นวันที่และเวลาที่ยังไม่ได้กล่าวถึง:

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

1
จริง แต่การเปลี่ยน ints เป็นสตริงและหลังอาจจะค่อนข้างแพงกว่าการทำงานโดยตรงกับ ints ดังนั้นฉันจะใช้อันนี้สำหรับการประมวลผลที่มีปริมาณน้อยเท่านั้น
Egor Kraev


-10

หากคุณต้องการสิ่งที่รวดเร็วdatetime_object.date()ให้วันที่ของวัตถุวันที่และเวลา


8
สหกรณ์ต้องการตรงข้ามที่จะไปจากการdate datetime
Tom

จากคำถาม: การแปลงตรงกันข้ามนั้นง่าย: 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

สหกรณ์มีdatetime.date()วัตถุไม่สตริง
Martijn Pieters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.