Подтвердить что ты не робот

Объединить столбцы даты и времени с помощью python pandas

У меня есть фреймворк 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
4b9b3361

Ответ 1

Стоит отметить, что вы, возможно, смогли прочитать это в напрямую, например. если вы использовали read_csv с помощью 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).

Ответ 2

Принятый ответ работает для столбцов типа данных string. Для полноты: я сталкиваюсь с этим вопросом при поиске, как это сделать, когда столбцы имеют тип данных: дата и время.

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

Ответ 3

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

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)

Ответ 4

У меня недостаточно репутации, чтобы комментировать jka.ne так:

Мне пришлось изменить jka.ne line, чтобы он работал:

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

Вы можете привести столбцы, если типы различаются (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

Лучший,

Ответ 6

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

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

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

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

Ответ 7

Вы также можете конвертировать в 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

Ответ 8

Сначала убедитесь, что у вас есть правильные типы данных:

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

Тогда вы легко комбинируете их:

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

Ответ 9

Используйте функцию combine:

datetime.datetime.combine(date, time)

Ответ 10

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

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

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