Pandas에서 datetime 형식을 변경하는 방법


109

내 데이터 프레임에는 기본적으로 pandas dtype 'object'로 변환되는 DOB열 (예제 형식 1/1/2016)이 있습니다.DOB object

와 날짜 형식이 변환 df['DOB'] = pd.to_datetime(df['DOB']), 날짜로 변환됩니다 : 2016-01-26과는 dtype다음과 같습니다 DOB datetime64[ns].

이제이 날짜 형식을 01/26/2016다른 일반 날짜 형식 으로 변환하고 싶습니다 . 어떻게하나요?

내가 시도하는 방법이 무엇이든 항상 날짜를 2016-01-26형식으로 표시 합니다.


Jupyter 노트북에서만 작동하는 솔루션을 찾고 계십니까? (어떤 경우에는 열별 '스타일러'를 사용합니다) 아니면 일반 Python 콘솔 및 iPython에서 작동합니까?
smci

답변:


208

다른 형식 dt.strftime으로 변환해야하는 경우 사용할 수 있습니다 datetime(그러나 dtype열의 경우 object( string)가 됨).

import pandas as pd

df = pd.DataFrame({'DOB': {0: '26/1/2016', 1: '26/1/2016'}})
print (df)
         DOB
0  26/1/2016 
1  26/1/2016

df['DOB'] = pd.to_datetime(df.DOB)
print (df)
         DOB
0 2016-01-26
1 2016-01-26

df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print (df)
         DOB        DOB1
0 2016-01-26  01/26/2016
1 2016-01-26  01/26/2016

32
'strftime'은 DOB1에 연산을 적용하기 위해 datetime 열을 유니 코드로 변환합니다. 다시 datetime으로 변환해야합니다. data_type을 잃지 않고 포맷하는 다른 방법이 없나요?
M.Zaman 2017

@jezrael, 데이터 유형도 유지하고 날짜를 객체 열에 반환하지 않는 더 나은 솔루션이 있습니까? 문제는 솔루션에서 제안한대로 'df ['DOB1 '] = df ['DOB ']. dt.strftime ('% m / % d / % Y ')'줄 뒤에 변환하려고하면 그 이후 날짜는 원래 형식으로 돌아갑니다.
Outcast

하하, .merge다른 데이터 프레임의 datetime 열에이 열 을 사용하려면 어떻게해야합니까? 다른 datetime 열을 개체 열로 변환하여 수행하는 것이 합리적 .merge입니까?
Outcast

네 분명히 동의하지만 "존재하지 않음 :("로 새 형식을 잃지 않고 형식을 변경 한 후 열을 datetime으로 변환 할 수 없다고 말씀하셨습니다. 그래서?
Outcast

좋아, 내가 이해하는 한, .merge두 열이 정확히 동일한 형식이 아니더라도 두 열이 datetimes 열이면 올바르게 수행 할 수 있습니다. 이게 옳은 거니?
Outcast

21

형식을 변경하지만 유형은 변경하지 않음 :

df['date'] = pd.to_datetime(df["date"].dt.strftime('%Y-%m'))

이 작업을 수행하기 전에 df [ "date"]가 datetime64 여야 함을 기억하십시오.
adhg

4
아니! date열에 있는 일부 항목의 원래 값 이 ' 2019 년 11 월 26 일 ' 이라고 가정합니다 . "시간의 문자열"을strftime() 의미 하므로 해당 항목에 대한 문자열이 됩니다. 그런 다음, 이 문자열로 변환됩니다 다시 받는 '해 11 월 현재 형식 만,을 1 , 2019 "! 따라서 결과는 다음과 같습니다. 형식은 변경되지 않지만 날짜 값 자체는 변경됩니다! df["date"].dt.strftime('%Y-%m') "2019-11"pd.to_datetime()datetime64
MarianD

2
@MarianD : 개별 답변에 대한 모든 의견은 유용하지만 답변 하단에있는 "함정 /하지 말 것"롤업 하나로 요약 해 주시겠습니까? 또한 각각의 문제가 무엇인지 명확하게 설명해야합니다. 입력 날짜가 예상 된 형식이 아닌 경우 예외가 발생하거나 날짜가 망가질 위험이 있습니다. "아니오!"라고 쓰면됩니다. 어디에나 그것을 전달하지 않습니다.
smci

8

아래 코드는 이전 코드 대신 저에게 효과적이었습니다.

df['DOB']=pd.to_datetime(df['DOB'].astype(str), format='%m/%d/%Y')

2
아니! 귀하의 format='%m/%d/%Y'매개 변수를위한 구문 분석 , 문자열을 당신이 생각하는, 즉 같은 형식으로 문자열을 제공하기 위해 (예를 들어 "5/13/2019"). 더 이상, 형식 변경이 없습니다. 여전히 표시됩니다 2019-05-13. 또는 df['DOB'].astype(str)형식이 아닌 항목 이 포함 된 경우 예외가 발생 합니다 (예 : 형식) "2019-05-13".
MarianD

4

첫 번째 답변과 비교하여 dt.strftime ()을 먼저 사용하고 pd.to_datetime ()을 사용하는 것이 좋습니다. 이런 식으로 여전히 datetime 데이터 유형이됩니다.

예를 들면

import pandas as pd

df = pd.DataFrame({'DOB': {0: '26/1/2016 ', 1: '26/1/2016 '})
print(df.dtypes)

df['DOB1'] = df['DOB'].dt.strftime('%m/%d/%Y')
print(df.dtypes)

df['DOB1'] = pd.to_datetime(df['DOB1'])
print(df.dtypes)

2
이것은 적어도 제 경우에는 작동하지 않습니다. 특히 열은 datetime 데이터 형식으로 변환되지만 값도 원래 형식으로 변환됩니다!
Outcast

아니! 내 버전의 Pandas (0.25.1)에서 구문 오류 (중괄호 누락), 또 다른 구문 오류 (dt.strftime () — datetimelike 값이있는 .dt 접근 자만 사용할 수 있음)-고유 한 데이터 유형에 의존하지만 다른 버전에서는 Pandas 고유 데이터 유형은 다를 수 있습니다.) 이상한 논리 — datetime을 문자열로 변환 한 다음 다시 datetime으로 변환하는 이유는 무엇입니까? rishi jain의 대답에 대한 내 의견을 참조하십시오.
MarianD

2

차이가 있습니다

  • 데이터 프레임 셀 의 내용 (이진 값) 및
  • 발표는 , 우리를 위해 인간을 (를 표시).

따라서 질문은 데이터 / 데이터 유형 자체를 변경하지 않고 내 데이터 의 적절한 표현 에 도달하는 방법입니다.

답은 다음과 같습니다.

  • 데이터 프레임을 표시하기 위해 Jupyter 노트북 을 사용하는 경우 또는
  • HTML 파일 형식으로 프레젠테이션에 도달하려는 경우 ( 추가 CSS 스타일링을 위해 준비된 많은 불필요한 속성 idclass속성이 포함 된 경우에도 -사용할 수도 있고 사용하지 않을 수도 있음)

스타일링을 사용하십시오 . 스타일링은 데이터 프레임 열의 데이터 / 데이터 유형을 변경하지 않습니다.

이제 Jupyter 노트북에서이 파일에 접근하는 방법을 보여 드리겠습니다. HTML 파일 형식의 프레젠테이션은 질문 끝 부분에있는 메모를 참조하세요.

나는 당신의 칼럼에 DOB 이미 타입datetime64 이 있다고 가정 할 것입니다 (당신은 그것에 도달하는 방법을 알고 있음을 보여주었습니다). 몇 가지 기본 스타일을 보여주기 위해 간단한 데이터 프레임 (단 하나의 열만 포함)을 준비했습니다.

  • 스타일 없음 :

       df
          DOB
0  2019-07-03
1  2019-08-03
2  2019-09-03
3  2019-10-03
  • 스타일 지정 mm/dd/yyyy:

       df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
          DOB
0  07/03/2019
1  08/03/2019
2  09/03/2019
3  10/03/2019
  • 스타일 지정 dd-mm-yyyy:

       df.style.format({"DOB": lambda t: t.strftime("%d-%m-%Y")}) 
          DOB
0  03-07-2019
1  03-08-2019
2  03-09-2019
3  03-10-2019

조심해!
복귀 객체는 dataframe 아닙니다 - 그것은 클래스의 목적은 Styler그래서, 다시 할당하지 않습니다 df:

하지 마십시오 :

df = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})    # Don´t do this!

(모든 데이터 프레임에는 .style속성으로 액세스 할 수있는 Styler 개체가 있으며 df.style데이터 프레임 자체가 아닌 이 개체를 변경했습니다 .)


질문과 답변:

  • Q : Jupyter 노트북 셀에서 마지막 명령 으로 사용 된 Styler 객체 (또는이를 반환하는 표현식) 가 Styler 객체 자체가 아니라 (스타일이 지정된) 테이블을 표시 하는 이유 는 무엇입니까?

  • A : 모든 Styler 개체에는 ._repr_html_()데이터 프레임을 렌더링하기위한 HTML 코드를 반환하는 콜백 메서드가 있기 때문입니다 (멋진 HTML 테이블).

    Jupyter Notebook IDE는이 메서드를 자동으로 호출하여 이를 가진 개체를 렌더링합니다.


노트 :

스타일링을 위해 Jupyter 노트북이 필요하지 않습니다 (즉 , 데이터 / 데이터 유형을 변경하지 않고 데이터 프레임을 멋지게 출력하기 위해 ).

Styler 객체에는 render()HTML 코드가있는 문자열을 얻으려는 경우 (예 : 형식이 지정된 데이터 프레임을 웹에 게시하거나 단순히 HTML 형식으로 표를 표시하는 경우) 메서드 가 있습니다.

df_styler = df.style.format({"DOB": lambda t: t.strftime("%m/%d/%Y")})
HTML_string = df_styler.render()

이와 같은 스타일러 코드는 아래에서 실행되도록 의도되었으며 Jupyter 노트북에서만 효과가 있으며 콘솔 또는 iPython에서 실행될 때 전혀 효과 가 없음을 지적 할 가치가 있습니다 . OP는 "Jupyter 아래"를 지정하지 않았으므로 설정에 따라 실행 가능한 솔루션 일 수도 있고 아닐 수도 있습니다. 많은 데이터 과학 코드가 복사 및 붙여 넣기되고 Jupyter 관련 가정이 명시 적으로 지정되지 않은 경우 사람들은 자신의 (콘솔) 환경에서 실행할 때 스타일러 코드가 "작동하지 않는"이유를 궁금해합니다.
smci

@smci, 내 대답의 두 번째 단락에 명시 적으로 언급되어 있지 않습니까? if모든 프로그래머에게 그렇게 알려진 조건 문의 형태로 ? — 귀하의 의견 감사에도 불구하고 어떤 사람들에게는 도움이 될 수 있습니다.
MarianD

그것은 매우 불분명하고 또한 묻혀 있습니다. 원래 질문은 Jupyter에 대해 아무것도 생각하지 않았으며 OP 및 일부 사용자는 Jupyter를 사용할 수 없을 수도 있습니다. 대답은 첫 번째 줄에 굵은 글씨로 표시해야합니다. "다음 접근 방식 (스타일링)은 Jupyter 노트북에서만 작동하며 Jupyter 노트북 외부에서 실행될 때 아무런 영향을 미치지 않습니다 . " . (데이터 과학 블로그와 사이트에서 사람들이 Jupyter가 아닌 환경에 Jupyter 코드를 게시하고 왜 작동하지 않는지 궁금해하는 사람들을 매일 봅니다).
smci

멋있는. 또한 다른 "convert-to-string-with-strftime-then-back-again-with-pd.to_datetime"접근법에서 확인한 모든 (많은) 함정을 추가하는 것이 좋습니다. 최소한 예외 발생 및 포착에 대해 언급해야합니다. 또한 그것이 얼마나 정확하고 예외적인지, 그리고 유효하지 않은 출력이 강제 될 것인지 또는 무엇을 강요 할 것인지를 제어하는 pd.to_datetime()인수 errors='raise'/'coerce'/'ignore', dayfirst, yearfirst, utc, exactNaT있습니다. "실제"데이터 세트에서 더 복잡하게 만드는 것은 혼합 / 누락 / 불완전한 형식, 시간, 시간대 등입니다. 예외가 반드시 나쁜 것은 아닙니다.
smci

... 아니면 Jupyter가 아닌 접근 방식의 함정 롤업으로 작성할 수 있습니다.
smci

1

아래 코드는 'datetime'유형으로 변경되고 주어진 형식 문자열의 형식도 지정합니다. 잘 작동합니다!

df['DOB']=pd.to_datetime(df['DOB'].dt.strftime('%m/%d/%Y'))

2
변경 :df['DOB']=pd.to_datetime(df['DOB']).dt.strftime('%m/%d/%Y')
John Doe

아니! - 왜 다시 날짜를 문자열로 날짜를 변환하는 ? 다른 답변에 대한 내 의견을 참조하십시오.
MarianD

1

이것을 시도하면 날짜 형식이 DD-MM-YYYY로 변환됩니다.

df['DOB'] = pd.to_datetime(df['DOB'], dayfirst = True)

아니! dayfirst=True날짜 구문 분석 순서의 사양 일뿐입니다. 예를 들어 '2-1-2019'와 같은 양가 날짜 문자열은 2019 년 2 월 1 일이 아닌 2019 년 1 월 2 일로 구문 분석됩니다. 더 이상 출력 형식에 대한 변경 사항은 없습니다 .
MarianD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.