Объединение столбцов даты и времени с помощью 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
1346   9  

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']

использовать combine функция:

datetime.datetime.combine(date, 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

    Ничего не найдено.