#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) )