Объедините столбцы даты и времени с помощью 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 отображается только дата, а информация о времени не отображается. Должны ли мы понимать, что время там спрятано или оно удалено?
Картикеян

Ответы:


169

Стоит отметить, что вы могли прочитать это напрямую, например, если вы использовали read_csvusing parse_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
Я не могу найти ничего относительно timedtype в пандах. У меня есть скорее timedeltadatetime), и в этом случае вам просто нужно их добавить, см. Мой ответ
toto_tico

Когда я 'pd.read_excel' столбец Excel, который Excel идентифицирует как «Время», pandas также автоматически считывает его как «Время» без каких-либо аргументов синтаксического анализа. Спасибо за это решение. +1
Саид

1
Просто примечание, поскольку pandas 1.0.0 pd.datetime устарел, и datetimeвместо этого предлагается просто явно импортировать модуль.
CopOnTheRun,

17

Вы можете использовать это, чтобы объединить дату и время в один столбец фрейма данных.

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

Чтение .csv файла с объединенными столбцами Date_Time:

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

Вы можете использовать эту строку, чтобы сохранить и другие столбцы.

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

1
Вы также можете использовать кастом date_parser, напримерparser = 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')

Я рассчитал оба подхода для относительно большого набора данных (> 500000 строк), и оба они имеют одинаковое время выполнения, но использование combineпроисходит быстрее (59 секунд для replaceпротив 50 секунд для combine).


5

Ответ действительно зависит от типа ваших столбцов . В моем случае у меня было datetimeи timedelta.

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

Если это ваш случай, вам просто нужно добавить столбцы:

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

Принятый ответ предполагает наличие строк: «Предполагая, что это просто строки, вы можете просто сложить их вместе (с пробелом)» . Мои ответы за datetimeи timedelta. Основной ответ каким-то образом выяснить, что столбцы были строками, или, может быть, это был просто ответ, который сработал для того, кто разместил вопрос.
toto_tico

4

Вы также можете конвертировать datetimeбез конкатенации, путем объединения datetimeи timedeltaобъектов. В сочетании с pd.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

В моем наборе данных были данные с разрешением в 1 секунду в течение нескольких дней, и анализ предложенными здесь методами был очень медленным. Вместо этого я использовал:

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

Обратите внимание, что использование cache=Trueделает синтаксический анализ дат очень эффективным, поскольку в моих файлах есть только пара уникальных дат, что неверно для комбинированного столбца даты и времени.


Я бы так и поступил.
Яаков Бресслер

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')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.