팬더를 사용할 때 날짜 부분 만 유지하십시오.


201

pandas.to_datetime데이터의 날짜를 구문 분석하는 데 사용 합니다. 팬더는 기본적으로 datetime64[ns]날짜가 모두 매일이지만 날짜를 나타냅니다 . 나는에 날짜를 변환하는 우아한 / 영리한 방법이 있는지 궁금 datetime.date또는 datetime64[D]내가 CSV에 데이터를 쓸 때, 날짜가가 추가되지 않도록 00:00:00. 요소별로 유형을 수동으로 변환 할 수 있다는 것을 알고 있습니다.

[dt.to_datetime().date() for dt in df.dates]

그러나 이것은 많은 행이 있고 사용 목적을 무효화하기 때문에 실제로 느립니다 pandas.to_datetime. dtype전체 열을 한 번 에 변환하는 방법이 있습니까? 또는 pandas.to_datetime매일 데이터로 작업하는 동안 시간 부분을 제거 할 수 있도록 정밀 사양을 지원합니까?


2
나는 좋은 방법을 모르지만 df.dates.apply(lambda x: x.date()) 적어도 조금 더 빨라야합니다. 또한 github.com/pydata/pandas/issues/2583을
root


1
이 두 질문을 다른 것으로 생각합니다. 참조 할 수있는 중복은 날짜 시간 열에서 날짜 부분과 시간 부분을 분리하는 것을 목표로합니다. 이 질문은 전체 열을 한 번에 변환하여 동기를 부여합니다. 날짜를 나타내는 20 개의 열이있는 데이터 프레임이 있다고 가정합니다. 다른 질문에서 제안한 것처럼 csv에 쓸 열을 지정하지 않으려 고합니다.

1
이것은 현재 지원되지 않습니다 (@root는 가능한 향상을 가리킴) .CSV에 쓸 때이 작업의 목적은 무엇입니까?
Jeff

3
글쎄, 종종 다른 프로그램에서 읽을 수 있도록 데이터를 csv 파일에 써야합니다. 중복 00:00:00은 특히 매일 순수한 데이터로 작업 할 때 일반적으로 처리하기 어렵게 만듭니다.

답변:


286

버전 이후 0.15.0이제 .dt날짜 구성 요소에만 액세스 하는 데 쉽게 사용할 수 있습니다.

df['just_date'] = df['dates'].dt.date

위의 반환 datetime.date당신이 갖고 싶어 DTYPE은, datetime64다음을 그냥 수 normalize자정까지의 시간 구성 요소는 모든 값을 설정 있도록 00:00:00:

df['normalised_date'] = df['dates'].dt.normalize()

이것은 dtype을 그대로 유지 datetime64하지만 디스플레이에는 date값만 표시됩니다 .


33

간단한 해결책 :

df['date_only'] = df['date_time_column'].dt.date

경고 만하면 유형이 객체로 변경됩니다. 일관성을 유지하려면 astype ( 'datetime64')을 사용해야합니다.
misantroop

25

OP가 제기 한 질문에 대한 가장 직접적인 답변 인 EdChum의 대답을 상향 조정했지만 실제로 성능 문제를 해결하지는 못합니다 (여전히 파이썬 datetime객체에 의존 하므로 벡터에서 작동하지 않습니다-즉, 느려질 것입니다).

더 나은 성능의 대안 은을 사용하는 것 df['dates'].dt.floor('d')입니다. 엄밀히 말하면 시간을로 설정하기 때문에 "날짜 부분 만 유지"하지 않습니다 00:00:00. 그러나 다음과 같은 경우 OP가 원하는대로 작동합니다.

  • 화면에 인쇄
  • CSV로 저장
  • 열을 사용하여 groupby

... 작업이 벡터화되기 때문에 훨씬 효율적입니다.

편집 : 사실, 영업 이익의 선호했을 대답은 아마도 "의 최신 버전은 pandas수 없습니다 이 경우 CSV로 시간을 쓰는 00:00:00모든 관측치에 대한".


불행히도 to_json여전히 전체를 씁니다 00:00:00.
IanS

@IanS 당신이 사용하는 것을 의미 date_format='iso'합니까?! 기본적으로 에포크 이후 초만 출력됩니다.
Pietro Battiston

그렇습니다.
IanS

이것은 dt.normalize()수백 개의 요소보다 긴 시리즈 보다 빠릅니다 .
C8H10N4O2

16

팬더 DatetimeIndex와 원하는 Series방법 normalize을 정확하게 수행 하는 메소드 가 있습니다.

이 답변 에서 그것에 대해 자세히 읽을 수 있습니다 .

로 사용할 수 있습니다 ser.dt.normalize()


15

팬더 v0.13 이상 : 사용 to_csvdate_format 매개 변수 와 함께

가능하면 datetime64[ns]시리즈를 objectdtype 시리즈 datetime.date개체 로 변환하지 마십시오 . 후자는 종종 다음을 사용하여 구성됩니다.pd.Series.dt.date 는 포인터 배열로 저장되며 순수한 NumPy 기반 시리즈에 비해 비효율적입니다.

CSV에 쓸 때는 형식이 중요하므로 의 date_format매개 변수 만 사용하십시오 to_csv. 예를 들면 다음과 같습니다.

df.to_csv(filename, date_format='%Y-%m-%d')

형식 지정 규칙 은 Python strftime지시문 을 참조하십시오 .


8

이것은 날짜를 추출하는 간단한 방법입니다.

import pandas as pd

d='2015-01-08 22:44:09' 
date=pd.to_datetime(d).date()
print(date)

OP는 이미 질문에 .date () 메서드를 사용하고 있으므로이 솔루션은 질문에 대답하지 않지만 date () 메서드를 참조로 사용하는 간단한 예를 보는 것이 유용하다는 것을 알았습니다.
Nic Scozzaro

5

로 변환 중 datetime64[D]:

df.dates.values.astype('M8[D]')

DataFrame col에 다시 할당해도 [ns]로 되돌아갑니다.

당신이 실제를 원한다면 datetime.date:

dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])

3
astype ( 'M8 [D]')을 사용하는 경우 결 측값을 원래 날짜 1970-1-1로 변환합니다. 요즘 pandas.to_datetime ()을 사용하는 것이 좋습니다.
Stewbaca

1
datetime 모듈을 일상적으로 포함하는 모든 사람 dt에게이 답변 스 니펫은 해당 모듈을 덮어 씁니다! @ Dale-Jung, 아마도 라인을 dt_index와 같은 것으로 바꿀 수 있습니다
yeliabsalohcin

나는 시도하고를 통해 새 행을 추가 다음에 이에 나는 또한 문제를 찾는거야 df.loc[date]방법은 인덱스 되돌립니다 후속 비교를 의미하는 타임 스탬프에 더 이상 작업을 백업하지 않습니다
yeliabsalohcin

3

누군가이 오래된 게시물을 볼 수 있도록 최신 답변을 제공합니다.

datetime으로 변환 할 때 "utc = False"를 추가하면 시간대 구성 요소가 제거되고 datetime64 [ns] 데이터 유형의 날짜 만 유지됩니다.

pd.to_datetime(df['Date'], utc=False)

"ValueError : Excel은 표준 시간대의 날짜 시간을 지원하지 않습니다. Excel에 쓰기 전에 날짜 시간이 시간대를 인식하지 못하도록하십시오"라는 오류없이 Excel에 파일을 저장할 수 있습니다.

여기에 이미지 설명을 입력하십시오


어떤 이유로 열에 집계 함수를 적용한 후에는 실패합니다.
RaphX

0

데이터 프레임의 열 집합 유형을 변경하고 하루를 지키는 시간을 제거하고 싶었습니다. round (), floor (), ceil () 모든 작업

df[date_columns] = df[date_columns].apply(pd.to_datetime)
df[date_columns] = df[date_columns].apply(lambda t: t.dt.floor('d'))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.