Создать столбец панд pd.date_range

1

У меня есть такие данные:

import datetime as dt
import pandas as pd
df = pd.DataFrame({'date':[dt.datetime(2018,8,25), dt.datetime(2018,7,21)],
                   'n':[10,7]})

Я хотел бы создать третий столбец, который содержит диапазон дат, созданный pd.date_range, с использованием "date" в качестве даты начала и "n" в качестве количества периодов. Итак, первая запись должна быть:

pd.date_range(dt.datetime(2018,8,25), periods=10, freq='d')

(У меня есть список "целевых" дат, и моя цель - проверить, содержит ли date_range любую из этих целевых дат).

Я попробовал это:

df['date_range'] = df.apply(lambda x: pd.date_range(x['date'],
                                                     x['n'],
                                                     freq='d'))

Но это дает KeyError: ("дата", "произошла в дату индекса")

Любая идея о том, как это сделать, не используя цикл for, или вообще есть лучшее решение?

Теги:
pandas

2 ответа

0

Я придумал решение, которое работает (но я уверен, что там лучше...)

# define target
tgt = [dt.datetime(2018,8,26)]

# find max n
max_n = max(df['n'])

# create that many columns and increment the day
for i in range(max_n):
    df['date_{}'.format(i)] = df['date'] + dt.timedelta(days=i)

new_cols = ['date_{}'.format(n) for n in range(max_n)]

# check each one and replace with a 1 if it matches the "tgt"
df['target_date'] = 0
for col in new_cols:
    df['target_date'] = np.where(df[col].isin(tgt),
                          1,
                          df['target_date'])

# drop intermediate cols
df = df[[i for i in df.columns if not i in new_cols]]
0

Вы должны добавить axis=1 в apply

df['date_range'] = df.apply(lambda x: pd.date_range(x['date'], x['n'], freq='d'), axis=1)
  • 0
    Это вызывает ValueError: длина значений не соответствует длине индекса

Ещё вопросы

Сообщество Overcoder
Наверх
Меню