Объединение столбцов даты и времени с помощью Python pandas
у меня есть панда dataframe со следующими столбцами;
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
9 ответов:
стоит отметить, что вы можете прочитать это в напрямую например, если вы используете
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]Примечание: удивительно (для меня), это прекрасно работает с NaNs преобразуется в NaT, но стоит беспокоиться, что преобразование (возможно, с помощью
принятый ответ работает для столбцов, имеющих тип данных
string. Для полноты: я сталкиваюсь с этим вопросом при поиске, как это сделать, когда столбцы имеют типы данных: дата и время.df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)
у меня недостаточно репутации, чтобы комментировать jka.ne Итак:
Я должен был изменить jka.не строки для его работы:
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)который в случае ОП будет:
combine_date_time(df, 'Date', 'Time')Я рассчитал оба подхода для относительно большого набора данных (>500.000 строк), и они оба имеют аналогичные среды выполнения, но с использованием
combineбыстрее (59s дляreplaceпротив 50-е годы дляcombine).
вы можете использовать это для объединения даты и времени в одном столбце фрейма данных.
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)
вы можете привести столбцы, если типы различны (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лучший
ответ какие типы столбца есть. В моем случае, у меня было
datetimeиtimedelta.> df[['Date','Time']].dtypes Date datetime64[ns] Time timedelta64[ns]если это ваш случай, то вам просто нужно добавить столбцы:
> df['Date'] + df['Time']
вы также можете конвертировать в
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
сначала убедитесь, что у вас есть правильные типы данных:
df["Date"] = pd.to_datetime(df["Date"]) df["Time"] = pd.to_timedelta(df["Time"])тогда вы легко комбинируете их:
df["DateTime"] = df["Date"] + df["Time"]
Comments