Python Pandas를 사용하여 날짜 및 시간 열 결합


113

다음 열이있는 pandas 데이터 프레임이 있습니다.

Date              Time
01-06-2013      23:00:00
02-06-2013      01:00:00
02-06-2013      21:00:00
02-06-2013      22:00:00
02-06-2013      23:00:00
03-06-2013      01:00:00
03-06-2013      21:00:00
03-06-2013      22:00:00
03-06-2013      23:00:00
04-06-2013      01:00:00

데이터 [ '날짜']와 데이터 [ '시간']을 결합하여 다음을 얻으려면 어떻게해야합니까? 사용하는 방법이 pd.to_datetime있습니까?

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00

모든 답변에 감사드립니다. 나는 그들 대부분을 시도했지만 더 큰 데이터 프레임의 일부로이 datetime 정보를 추가 할 때 여전히. datetime 열에는 날짜 만 표시되고 시간 정보는 표시되지 않습니다. 시간이 거기에 숨겨져 있거나 제거된다는 것을 이해해야합니까?
karthikeyan

답변:


169

예를 들어 using을 사용하는 경우 직접 읽을 수 있었을 수도 있다는 점을 언급 할 가치가 있습니다 .read_csvparse_dates=[['Date', 'Time']]

이것들이 단지 문자열이라고 가정하면 (공백으로) 간단히 추가 할 수 있으므로 다음을 적용 할 수 있습니다 to_datetime.

In [11]: df['Date'] + ' ' + df['Time']
Out[11]:
0    01-06-2013 23:00:00
1    02-06-2013 01:00:00
2    02-06-2013 21:00:00
3    02-06-2013 22:00:00
4    02-06-2013 23:00:00
5    03-06-2013 01:00:00
6    03-06-2013 21:00:00
7    03-06-2013 22:00:00
8    03-06-2013 23:00:00
9    04-06-2013 01:00:00
dtype: object

In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
Out[12]:
0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
dtype: datetime64[ns]

참고 : 놀랍게도 (저에게는) NaN이 NaT로 변환되면 잘 작동하지만 변환 (아마도 raise인수 사용)에 대해 걱정할 가치가 있습니다.


6
자동 조합 기능에 대해 몰랐으며 다음과 같은 여러 항목에서도 작동합니다 parse_dates=[['Start date', 'Start time'], ['End date', 'End time']]). Pandas <3
5agado

43

허용되는 대답은 데이터 유형의 열에 대해 작동합니다 string. 완전성을 위해 : 열이 데이터 유형 인 날짜 및 시간 일 때이를 수행하는 방법을 검색 할 때이 질문을 발견했습니다.

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)

2
timepandas 에서 dtype 과 관련하여 아무것도 찾을 수 없습니다 . 나는 오히려 timedelta(그리고 a datetime) 당신이 그들을 추가 해야하는 경우 내 대답을 참조하십시오
toto_tico

Excel에서 "시간"으로 식별하는 Excel 열을 'pd.read_excel'하면 pandas도 구문 분석 인수없이 자동으로 "시간"으로 읽습니다. 이 솔루션에 감사드립니다. +1
Saeed

1
참고로 pandas 1.0.0 부터는 pd.datetime 더 이상 사용되지 않으며datetime 대신 모듈을 명시 적으로 가져 오는 것이 좋습니다.
CopOnTheRun

16

이를 사용하여 날짜와 시간을 동일한 데이터 프레임 열에 병합 할 수 있습니다.

import pandas as pd    
data_file = 'data.csv' #path of your file

병합 된 열 Date_Time이있는 .csv 파일 읽기 :

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 

이 행을 사용하여 다른 두 열도 유지할 수 있습니다.

data.set_index(['Date', 'Time'], drop=False)

1
custom을 사용할 수도 있습니다. date_parserparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity

11

유형이 다른 경우 (datetime 및 timestamp 또는 str) 열을 캐스트하고 to_datetime을 사용할 수 있습니다.

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))

결과 :

0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00

베스트,


10

jka.ne 에 대해 언급 할만한 평판이 충분하지 않습니다 .

작동하려면 jka.ne의 줄 을 수정 해야했습니다.

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)

이것은 다른 사람들에게 도움이 될 수 있습니다.

또한 다음 replace대신 사용하여 다른 접근 방식을 테스트했습니다 combine.

def combine_date_time(df, datecol, timecol):
    return df.apply(lambda row: row[datecol].replace(
                                hour=row[timecol].hour,
                                minute=row[timecol].minute),
                    axis=1)

OP의 경우 다음과 같습니다.

combine_date_time(df, 'Date', 'Time')

비교적 큰 데이터 세트 (> 500.000 행)에 대해 두 가지 접근 방식을 모두 시간을 설정했으며 둘 다 유사한 런타임을 가지고 있지만 사용하는 combine것이 더 빠릅니다 (는 59 초, replace은 50 초 combine).


5

은 열 유형이 무엇인지에 따라 달라집니다 . 제 경우에는 datetimetimedelta.

> df[['Date','Time']].dtypes
Date     datetime64[ns]
Time    timedelta64[ns]

이 경우 열을 추가하기 만하면됩니다.

> df['Date'] + df['Time']

허용되는 대답은 문자열을 가정합니다. "이것들이 단지 문자열이라고 가정하면 간단히 함께 추가 할 수 있습니다 (공백 포함)" . 내 대답은 datetimetimedelta입니다. 주된 대답은 어떻게 든 열이 문자열이라는 것을 알아 내거나 질문을 게시 한 사람에게 효과가 있었던 대답 일 수도 있습니다.
toto_tico

4

및 개체 datetime를 결합하여 문자열 연결없이 로 변환 할 수도 있습니다. 와 함께 사용 하면 소스 시리즈를 동시에 제거 할 수 있습니다.datetimetimedeltapd.DataFrame.pop

df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time'))

print(df)

             DateTime
0 2013-01-06 23:00:00
1 2013-02-06 01:00:00
2 2013-02-06 21:00:00
3 2013-02-06 22:00:00
4 2013-02-06 23:00:00
5 2013-03-06 01:00:00
6 2013-03-06 21:00:00
7 2013-03-06 22:00:00
8 2013-03-06 23:00:00
9 2013-04-06 01:00:00

print(df.dtypes)

DateTime    datetime64[ns]
dtype: object

1
훌륭한 일반 솔루션! 나는 datetime date를 입력하고 str time을 입력했고 이것은 작동했습니다.
참새

3

먼저 올바른 데이터 유형이 있는지 확인하십시오.

df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])

그런 다음 쉽게 결합 할 수 있습니다.

df["DateTime"] = df["Date"] + df["Time"]

2

combine기능 사용 :

datetime.datetime.combine(date, time)

2

내 데이터 세트에는 며칠 동안 1 초 해상도 데이터가 있었고 여기에서 제안 된 방법에 의한 구문 분석은 매우 느 렸습니다. 대신 다음을 사용했습니다.

dates = pandas.to_datetime(df.Date, cache=True)
times = pandas.to_timedelta(df.Time)
datetimes  = dates + times

를 사용 cache=True하면 내 파일에 고유 한 날짜가 몇 개만 있기 때문에 날짜를 매우 효율적으로 구문 분석 할 수 있습니다. 이는 결합 된 날짜 및 시간 열에는 해당되지 않습니다.


이것이 내가 할 일입니다.
Yaakov Bressler

1

데이터:

<TICKER>, <PER>, <DATE>, <TIME> , <OPEN>, <HIGH>, <LOW>, <CLOSE>, <VOL> SPFB.RTS, 1, 20190103,100100 , 106580.0000000,107260.0000000,106570.0000000 , 107230.0000000,3726

암호:

data.columns = ['ticker', 'per', 'date', 'time', 'open', 'high', 'low', 'close', 'vol']    
data.datetime = pd.to_datetime(data.date.astype(str) + ' ' + data.time.astype(str), format='%Y%m%d %H%M%S')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.