Преобразование «Дней» из объекта Timedelta в обычный объект

#python #pandas #datetime

#питон #панды #дата и время

Вопрос:

Я пытаюсь объединить два приведенных ниже фрейма данных в «день», но объект временной дельты препятствует этому. Я понимаю, что я должен быть в состоянии сделать что-то подобное print(df['day'].days) и получить фактический день без «дней».

df1

 import pandas as pd from itertools import product  missing = pd.DataFrame(product(range(1,31), range(1,5)), columns=['date','time_of_day']) missing = pd.concat([missing.assign(pid=_id) for _id in vec], ignore_index=True) #pd.DataFrame(product([vec, range(1,31), range(1,5)], names=['pid','day','time_of_day']))  missing.pid = missing.pid.astype(str)  

df 2

 from timedelta import date  def random_dates(start, end, n=12):   start_u = start.value//10**9  end_u = end.value//10**9   return pd.to_datetime(np.random.randint(start_u, end_u, n), unit='s')  start = pd.to_datetime('2015-01-01') end = pd.to_datetime('2018-01-01') random_dates(start, end)  df = pd.DataFrame({'datestamp':random_dates(start, end)}) df['date'] = pd.to_datetime(df['datestamp']).dt.date df['time'] = pd.to_datetime(df['datestamp']).dt.time   df = pd.concat([df.assign(pid=_id) for _id in vec], ignore_index=True)  df['last'] = df .sort_values('date') .groupby('pid')['date'] .transform('last')  df['days'] = df['last'] - df['date'] df df['days'].days #doesn't work  

слияние

 missing.merge(df, how = 'left', on = ['pid', 'day'])  

соответствующая ошибка введите описание изображения здесь

Комментарии:

1. Ваш df2 не работает. Что такое «данные»? где «pid»? пожалуйста, приведите рабочий пример ваших данных.

2. Я сожалею об этом. Обновили! Спасибо!

3. извините, в чем проблема? возникла ли ошибка? если да, пожалуйста, предоставьте полную обратную связь. кроме того, df['days'].days не должно работать — серия дней не будет иметь атрибута days

4. Предоставила сообщение об ошибке и обратную связь.

5. что такое vec ?, что вы хотите этим from timedelta import date сказать ? и вместо df['days'].days того , что ты имел в виду df['days'].dt.days ?

Ответ №1:

таким образом, это будет преобразовано в дни как объект, не зависящий от времени:

def get_custom_str_time(x): возвращает математический этаж(x.total_seconds()/(3600*24))

df.вставить( 0, «день», df[«дни»].применить(get_custom_str_time) )