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