Как изменить дату, выраженную в виде интервала, чтобы она выражалась в обычном формате %Y-%M-%D.
Первоначально у меня был df, который выглядел так:
Id Date Quantity
1000A 2018-03-22 20.0
1000A 2018-03-29 8.0
1000A 2018-03-27 4.0
1000A 2018-03-28 10.0
или:
all_data = pd.DataFrame({'Id': ['1000A','1000A','1000A','1000A'], 'Date': ['2018-03-28', '2018-04-12', '2018-05-02', '2018-06-28'], 'Quantity' : [20.0, 8.0, 4.0, 10.0]})
all_data.Date = pd.to_datetime(all_data.Date)
Я применил к нему материал, чтобы получить даты, сгруппированные по месяцам, начиная с сегодняшней даты.
today1 = pd.to_datetime('today').normalize()
frequency1 = '30D'
Nbin1 = (today1 - all_data['Date'].min()) // pd.Timedelta(frequency1) + 1 # Number of bins
bins1 = [today1 - n * pd.Timedelta(frequency1) for n in range(Nbin1, -1, -1)]
data11 = all_data.groupby(['Id', pd.cut(all_data['Date'], bins=bins1)]).sum().fillna(0).reset_index()
вывод выглядит так:
Id Date Quantity
0 1000A (2018-03-02, 2018-04-01] 20.0
1 1000A (2018-04-01, 2018-05-01] 8.0
2 1000A (2018-05-01, 2018-05-31] 4.0
3 1000A (2018-05-31, 2018-06-30] 10.0
....
n. 1000A (2020-11-16, 2020-12-16] 0.0
Я не могу найти способ преобразовать столбец даты обратно в обычный формат даты, например:
Date
2018-04-01
2018-05-01
2018-05-31
2018-06-30
Я чувствую, что перепробовал все инструменты, которые смог найти, но ничего не помогает, любая помощь будет оценена по достоинству.






У вас есть категориальный dtype в Date. Один из способов справиться с этим — преобразовать его в str, чтобы вы могли извлечь нужный шаблон, а затем преобразовать его в datetime:
data11['Date'] = data11.Date.astype(str).str.extract(', (.+?)]').astype('datetime64[ns]')
Конечно! Чтобы получить доступ к любому методу str в серии pandas, вам нужно использовать его, точно так же, как вы должны использовать dt для доступа к свойствам даты и времени в серии.
С другой стороны, если вы получаете доступ к одному значению из серии, например data11.Date.astype(str)[0], вы можете (и должны) использовать метод str напрямую.
Я понимаю, супер полезно, спасибо!
@Peyo и Caina, это неправильный способ извлечения значений из Interval: type(data11.iloc[0, 1]) → pandas._libs.interval.Interval. Смотрите дубликат. data11.Date = pd.IntervalIndex(data11.Date).right или data11.Date = data11.Date.apply(lambda x: x.right), однако первый вариант векторизован.
Привет, @TrentonMcKinney! Спасибо, что указали лучший способ и более подходящий способ сделать это. Я полностью согласен с вами в этом, хотя я также не согласен с такими утверждениями, как «правильный путь», поскольку несколько подходов могут прекрасно работать для достижения одной и той же цели (как в этом случае). Тем не менее, вы только что расширили наши знания, так что еще раз спасибо!
Рад, что информативно. Кроме того, я говорю правильно в том смысле, что это правильный способ использования аксессора .dt для работы с данными даты и времени. Таким образом, это «правильный способ» использовать методы Interval для извлечения левого или правого предела. Признано, что может быть более одного способа, но это ссылка на Дзен Python (import this). Должен быть один - и желательно только один - очевидный способ сделать это. Счастливых праздников!
чудо! Спасибо! я пытался использовать
astype(str).split(), чтобы решить эту проблему, но это не сработало, не могли бы вы сказать мне, почему повторениеstr- это путь?