Поєднайте стовпці дати та часу за допомогою пандон python


113

У мене є фрейм даних панд з наступними стовпцями;

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

Дякую за всі відповіді. Я спробував більшість з них, але все ж, коли я додаю цю інформацію про дату як частину більшого фрейму даних. У стовпці "Час дати" відображається лише дата, а інформація про час не відображається. Чи слід розуміти, що там час ховається чи його знімають?
karthikeyan

Відповіді:


169

Варто зазначити, що, можливо, ви змогли прочитати це безпосередньо, наприклад, якщо ви 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аргумент).


6
Чи не знав про можливість автоматичного комбінування, і вона працює з декількома записами теж, як: parse_dates=[['Start date', 'Start time'], ['End date', 'End time']]). Панди <3
5агадо

43

Прийнята відповідь працює для стовпців, що мають тип даних string. Для повноти: я стикаюся з цим питанням під час пошуку, як це зробити, коли стовпці мають типи даних: дата та час.

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

2
Я нічого не можу знайти про timeтип, у пандах. У мене є скоріше timedelta(і а datetime); у такому випадку вам просто потрібно додати їх, дивіться мою відповідь
toto_tico

Коли я 'pd.read_excel' стовпець Excel, який Excel ідентифікує як "Час", панди також читають його як "Час" автоматично, не вимагаючи аргументу розбору. Дякую за це рішення. +1
Саїд

1
Лише зауваження, оскільки панди 1.0.0 pd.datetime застаріли, і пропонується datetimeзамість цього явно імпортувати модуль.
CopOnTheRun

16

Ви можете використовувати це для об'єднання дати та часу в одному стовпчику фрейму даних.

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

Ви можете накидати стовпці, якщо типи різні (дата і часова позначка або 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)

що у випадку ОП було б:

combine_date_time(df, 'Date', 'Time')

Я приурочив обидва підходи для відносно великого набору даних (> 500 000 рядків), і в них обох є схожі періоди виконання, але використання combineшвидше (59 для replacevs 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 та type 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.