Pandas 데이터 프레임의 날짜를 '날짜'데이터 유형으로 어떻게 변환합니까?


105

팬더 데이터 프레임이 있고 열 중 하나에 형식의 날짜 문자열이 있습니다. YYYY-MM-DD

예를 들어 '2013-10-28'

현재 dtype컬럼의은입니다 object.

열 값을 Pandas 날짜 형식으로 어떻게 변환합니까?

답변:


110

astype 사용

In [31]: df
Out[31]: 
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [32]: df['time'] = df['time'].astype('datetime64[ns]')

In [33]: df
Out[33]: 
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

1
좋아요-감사합니다-각 날짜가 끝날 때 00:00:00을 어떻게 제거합니까?
user7289 2013 년

1
pandas 타임 스탬프에는 날짜와 시간이 모두 있습니다. 파이썬 날짜 객체로 변환한다는 뜻입니까?
waitingkuo 2013 년

7
당신은 그것을 변환 할 수 있습니다df['time'] = [time.date() for time in df['time']]
waitingkuo 2013 년

3
[ns]는 무엇을 의미합니까? 텍스트 문자열을 날짜로 만들고 해당 날짜의 시간 부분을 제거 할 수 있습니까?
yoshiserry 2014 년

1
@yoshiserry는 나노초이며, 제대로 변환되면 날짜가 후드 아래에 저장되는 방식입니다 (나노초 단위의 에포크 시간).
Andy Hayden

114

기본적으로 @waitingkuo와 동일하지만 to_datetime여기서 사용 합니다 (조금 더 깔끔해 보이며 추가 기능을 제공합니다. 예 dayfirst).

In [11]: df
Out[11]:
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [12]: pd.to_datetime(df['time'])
Out[12]:
0   2013-01-01 00:00:00
1   2013-01-02 00:00:00
2   2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]

In [13]: df['time'] = pd.to_datetime(df['time'])

In [14]: df
Out[14]:
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

취급 ValueErrors
당신이하는 상황에 처한 경우

df['time'] = pd.to_datetime(df['time'])

던졌습니다

ValueError: Unknown string format

이는 유효하지 않은 (강제 불가능한) 값이 있음을 의미합니다. 로 변환해도 괜찮다면 다음에 인수를 pd.NaT추가 할 수 있습니다 .errors='coerce'to_datetime

df['time'] = pd.to_datetime(df['time'], errors='coerce')

안녕 여러분, @AndyHayden 날짜에서 시간 부분을 제거 할 수 있습니까? 나는 그 부분이 필요하지 않습니까?
yoshiserry 2014 년

pandas의 0.13.1에서는 후행 00:00:00이 표시되지 않습니다.
Andy Hayden 2014 년

다른 버전에서는 어떻게 제거하거나 표시하지 않습니까?
yoshiserry 2014 년

나는 이것이 좋은 방법으로 할 수 있다고 생각하지 않는다. float_format (당신이 본 것)과 같은 date_format을 추가하는 논의가있다. 어쨌든 업그레이드하는 것이 좋습니다.
Andy Hayden 2014 년

내 문제는 내 날짜가 41516.43 형식이며이 오류가 발생합니다. 새 열에 2014-02-03과 같은 내용이 반환 될 것으로 예상합니다.?! 오류 : # "load_date"열의 날짜 값을 budget_dataset [ 'date_last_load'] = pd.to_datetime (budget_dataset [ 'load_date']) budget_dataset -c : 2 : SettingWithCopyWarning : DataFrame에서 슬라이스 사본. 대신 .loc [ROW_INDEX, col_indexer = 값을 이용하여 시도
yoshiserry

36

CSV 파일에서 많은 데이터가 Pandas로 들어 온다고 생각합니다.이 경우 처음 CSV를 읽는 동안 날짜를 간단히 변환 할 수 있습니다.

dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])여기서 0은 날짜가있는 열을 나타냅니다. 날짜를 색인으로 사용하려면 여기에
추가 할 수도 있습니다 , index_col=0.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html을 참조 하세요.


고마워, 그게 바로 내가 필요했던 것이었다. 문서는 이동되었지만 여기에서 찾을 수 있습니다. pandas.pydata.org/pandas-docs/stable/reference/api/…
Sastibe

24

이제 할 수 있습니다 df['column'].dt.date

datetime 객체의 경우 모두 00:00:00 인 시간이 표시되지 않으면 판다가 아닙니다. 그것은 사물을 예쁘게 보이게하려는 iPython 노트북입니다.


2
이것은 나를 위해 작동하지 않습니다, 불평 : datetimelike 값을 가진 .dt 접근 자만 사용할 수 있습니다
smishra

2
df[col] = pd.to_datetime(df[col])먼저 열을 날짜 시간 개체로 변환 해야 할 수 있습니다 .
szeitlin

이 답변의 문제 는 팬더 dtype = object의 실제 메모리보다 훨씬 더 많은 메모리를 차지하는 열을 변환한다는 것 datetime dtype입니다.
elPastor

6

이를 수행하는 또 다른 방법은 datetime으로 변환 할 여러 열이있는 경우 잘 작동합니다.

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)

질문은 datetime이 아닌 날짜를 묻습니다.
Mark Andersen 19

@MarkAndersen date열에 값만있는 한 datetime으로 변환하면 관련 정보 만 유지됩니다. 사용하여 명시 적으로 변환 df['datetime_col'].dt.date하면 objectdtype 이 생성됩니다 . 메모리 관리 손실.
Sumanth Lazarus


1

날짜를 다른 빈도로 변환해야하는 경우 일 수 있습니다. 이 경우 날짜별로 색인을 설정하는 것이 좋습니다.

#set an index by dates
df.set_index(['time'], drop=True, inplace=True)

그런 다음 가장 필요한 날짜 형식으로 더 쉽게 변환 할 수 있습니다. 아래에서는 여러 날짜 형식으로 순차적으로 변환하여 궁극적으로 월초에 일련의 일일 날짜로 끝납니다.

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

#Convert to monthly dates
df.index = df.index.to_period(freq='M')

#Convert to strings
df.index = df.index.strftime('%Y-%m')

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

간결함을 위해 위의 각 줄 다음에 다음 코드를 실행하는 것을 보여주지 않습니다.

print(df.index)
print(df.index.dtype)
print(type(df.index))

이것은 나에게 다음과 같은 출력을 제공합니다.

Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>

Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

0

pd.to_datetime 함수를 사용하여 행 중 하나를 타임 스탬프로 변환 한 다음 .map을 사용하여 공식을 전체 열에 매핑합니다.


0
 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  object
 1   endDay          110526 non-null  object

import pandas as pd

df['startDay'] = pd.to_datetime(df.startDay)

df['endDay'] = pd.to_datetime(df.endDay)

 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  datetime64[ns]
 1   endDay          110526 non-null  datetime64[ns]

0

완전성을 위해 가장 간단하지 않을 수있는 또 다른 옵션은 @SSS가 제안한 것과 약간 비슷하지만 datetime 라이브러리를 사용하는 것입니다.

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.