파이썬에서 DateTime 객체의 시간을 자르는 방법은 무엇입니까?


251

파이썬 날짜 시간 객체를 자르는 고급 방법은 무엇입니까?

이 특별한 경우, 오늘까지. 기본적으로시, 분, 초 및 마이크로 초를 0으로 설정합니다.

출력이 문자열이 아닌 datetime 객체가되기를 원합니다.

답변:


376

나는 이것이 당신이 찾고있는 것이라고 생각합니다 ...

>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)

그러나 시간의 측면에 신경 쓰지 않는다면 실제로 물건 주위를 통과해야 date합니다 ...

>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)

14
시간대를 인식하는 dt를 사용하면 datetime.datetime (dt.year, dt.month, dt.day)은 tzinfo 정보를 버립니다.
ʇsәɹoɈ

1
오늘 바로 찾으
신다면

4
python 2와 python 3 docsreplace()메소드 datetime 객체를 반환 한다고 명시하고 있으므로 정확한 주문은 다음과 같습니다.dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
Brad M

3
OP는 객체 가 datetime아닌을 원합니다 date( dt.date()호출을 사용할 수 있습니다 (명시 적 생성자를 사용할 필요가 없음)). .replace()경우 방법이 실패 할 수 있습니다 datetime나노초 지원을 추가합니다 . 대신 사용할datetime.combine()있습니다 .
jfs

@ chrisw 왜 한 줄로 작성하지 않겠습니까 datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)?
3kstc

66

시간에 신경 쓰지 date않는다면 a를 사용하십시오 datetime.

>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)

다음과 같이 날짜 시간을 업데이트 할 수 있습니다.

>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)

9
시간대 인식 날짜 시간을 사용하면 now.date ()는 tzinfo 정보를 버립니다.
ʇsәɹoɈ

1
@ ʇsәɹoɈ : 여기에 당신이 수있는 방법은 시간대 인식 자정 얻을
JFS

34

4 년 후 : 피하는 또 다른 방법 replace

나는 4 년 전에 받아 들여진 대답이 작동한다는 것을 알고 있지만 다음을 사용하는 것보다 약간 가벼운 것 같습니다 replace.

dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)

노트

  • datetime시간 속성을 생성자에 전달하지 않고 객체 를 만들면 자정이됩니다.
  • 다른 사람들이 지적했듯이, 이것은 나중에 timedelta와 함께 사용하기 위해 datetime 객체를 원한다고 가정합니다.
  • 물론 첫 번째 줄로 이것을 대체 할 수 있습니다. dt = datetime.datetime.now()

20

날짜 시간 객체 는 변경할 수 없으므로 잘라낼 수 없습니다 .

그러나 다음은 원래 날짜 또는 tzinfo를 버리지 않고 0 시간, 분, 초 및 마이크로 초 필드로 새로운 날짜 시간을 구성하는 한 가지 방법입니다.

newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)

1
+1 : replace옵션을 먼저 설정하면 원하는 옵션 일 수 있습니다.
S.Lott

사용하는 것이 올바르지 않습니다 tzinfo=now.tzinfo. tzinfo자정에 다른 예를 할 수있다, UTC는 오프셋 2012-04-01 00:09:00호주 / 멜버른 시간대에 (오전 9시)입니다 AEST+10:00만은 AEDT+11:002012-04-01 00:00:00(자정) - 당일 끝 DST 전환이있다. pytz모듈을 사용 하여 문제를 해결할 수 있습니다 . 내 답변을 참조하십시오.
jfs

13

주어진 datetime 객체에 해당하는 자정을 얻으려면 datetime.combine()method를 사용할 수 있습니다 .

>>> from datetime import datetime, time
>>> dt = datetime.utcnow()
>>> dt.date()
datetime.date(2015, 2, 3)
>>> datetime.combine(dt, time.min)
datetime.datetime(2015, 2, 3, 0, 0)

에 비해 장점 방법 이다 기반 솔루션을 경우에도 계속 작동 모듈 출시는 나노초 지원 ..replace()datetime.combine()datetime

tzinfoDST 전환으로 인해 자정에 utc 오프셋이 다를 수 있으므로 순진 솔루션 (설정 tzinfo시간 속성)이 실패 할 수 있습니다. 참조 내가 특정 시간대에 대해 "자정"의 UTC 시간을 어떻게합니까?


7

팬더 를 사용할 수 있습니다 (해당 작업에는 오버 헤드가 발생할 수 있음). 일반적인 숫자 및 오프셋 별칭의 팬더 주파수와 같이 round , floorceil을 사용할 수 있습니다 .

import pandas as pd
import datetime as dt

now = dt.datetime.now()
pd_now = pd.Timestamp(now)

freq = '1d'
pd_round = pd_now.round(freq)
dt_round = pd_round.to_pydatetime()

print(now)
print(dt_round)

"""
2018-06-15 09:33:44.102292
2018-06-15 00:00:00
"""

4

datetime.strftime을 사용하여 일, 월, 년을 추출 할 수 있습니다 ...

예 :

from datetime import datetime
d = datetime.today()

# Retrieves the day and the year
print d.strftime("%d-%Y")

출력 (오늘의 경우) :

29-2011

요일을 검색하려는 경우 다음과 같이 요일 속성을 사용할 수 있습니다.

from datetime import datetime
d = datetime.today()

# Retrieves the day
print d.day

출력 (오늘) :

29

글쎄, 나는 이미 이것을 한 번 수행하므로 더 많은 오버 헤드가있을 수 있으며 datetime 객체에서시 분 등 필드를 설정하면됩니다.
Kyle Brandt

Heh, 그것은 그것을하기위한 이상한 방법입니다, 당신은 실제로 그냥 할 수 있습니다 d.day.
Jochen Ritzel

3

날짜를 조작하는 데 사용되는 훌륭한 라이브러리가 있습니다 : Delorean

import datetime
from delorean import Delorean
now = datetime.datetime.now()
d = Delorean(now, timezone='US/Pacific')

>>> now    
datetime.datetime(2015, 3, 26, 19, 46, 40, 525703)

>>> d.truncate('second')
Delorean(datetime=2015-03-26 19:46:40-07:00, timezone='US/Pacific')

>>> d.truncate('minute')
Delorean(datetime=2015-03-26 19:46:00-07:00, timezone='US/Pacific')

>>> d.truncate('hour')
Delorean(datetime=2015-03-26 19:00:00-07:00, timezone='US/Pacific')

>>> d.truncate('day')
Delorean(datetime=2015-03-26 00:00:00-07:00, timezone='US/Pacific')

>>> d.truncate('month')
Delorean(datetime=2015-03-01 00:00:00-07:00, timezone='US/Pacific')

>>> d.truncate('year')
Delorean(datetime=2015-01-01 00:00:00-07:00, timezone='US/Pacific')

날짜 시간 값을 다시 얻으려면 :

>>> d.truncate('year').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

예를 들어 DST 전환으로 인해 결과 시간이 다른 utc 오프셋을 갖는 경우 잘못된 시간 (잘못된 utc 오프셋)을 반환합니다. 참조 내가 특정 시간대에 대해 "자정"의 UTC 시간을 어떻게합니까?
jfs


1

이것을 처리하는 datetime_truncate 모듈이 있습니다. 그냥 datetime.replace를 호출합니다.


1

6 년 후 ... 나는이 게시물을 찾았고 numpy aproach를 더 좋아했습니다.

import numpy as np
dates_array = np.array(['2013-01-01', '2013-01-15', '2013-01-30']).astype('datetime64[ns]')
truncated_dates = dates_array.astype('datetime64[D]')

건배


1
>>> import datetime
>>> dt = datetime.datetime.now()
>>> datetime.datetime.date(dt)
datetime.date(2019, 4, 2)

1

당신은 그냥 사용할 수 있습니다

datetime.date.today()

가볍고 원하는 것을 정확하게 반환합니다.


같은 대답이 전에 주어졌지만 새로운 것은 없습니다.
slfan

죄송하지만 @slfan이지만 브라우저에서 "검색"을 사용하여 이름이있는 게시물을 보지 못했습니다.
Bordotti

1
나에 의해, 3 년 전에 zx81에 의해. datetime.date.today ()를 검색하십시오. 답변이 정확하면 다시 답변하지 말고 공감해야합니다.
slfan


0

DateTime 유형의 Series를 처리하는 경우 특히 Series 객체에 행이 많은 경우 더 효율적으로 잘라낼 수 있습니다.

플로어 기능을 사용할 수 있습니다

예를 들어 몇 시간으로 자르려면 다음을 수행하십시오.

날짜 범위 생성

times = pd.Series(pd.date_range(start='1/1/2018 04:00:00', end='1/1/2018 22:00:00', freq='s'))

교체 기능과 바닥 기능 간의 작동 시간을 비교하여 확인할 수 있습니다.

%timeit times.apply(lambda x : x.replace(minute=0, second=0, microsecond=0))
>>> 341 ms ± 18.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit times.dt.floor('h')
>>>>2.26 ms ± 451 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

0

한 줄에 들어가지만 특별히 우아하지 않은 또 다른 방법이 있습니다.

dt = datetime.datetime.fromordinal(datetime.date.today().toordinal())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.