Вменение недостающих дат в панде Dataframe - PullRequest
1 голос
/ 20 октября 2019
df = pd.read_csv(
    'https://media-doselect.s3.amazonaws.com/generic/MJjpYqLzv08xAkjqLp1ga1Aq/Historical_Data.csv')
df.head()

    Date        Article_ID   Country_Code   Sold_Units
0   20170817        1132       AT               1
1   20170818        1132       AT               1
2   20170821        1132       AT               1
3   20170822        1132       AT               1
4   20170906        1132       AT               1

У меня есть вышеуказанный DataFrame. Обратите внимание, что столбец «Дата» имеет тип int64 и содержит пропущенные даты 19-го и 20-го числа.

Я хочу перевести его в формат гггг-мм-дд и вменять пропущенные даты со значениями 0 в идентификаторе статьи, код выпускаи проданные единицы.

До сих пор я пытался:

df['Date'] = pd.to_datetime(df['Date'].astype(str), format='%Y-%m-%d')

, чтобы получить даты в необходимом формате.

    Date         Article_ID  Outlet_Code   Sold_Units
0   2017-08-17      1132       AT               1
1   2017-08-18      1132       AT               1
2   2017-08-21      1132       AT               1
3   2017-08-22      1132       AT               1
4   2017-09-06      1132       AT               1

Тем не менее, как мне вменять пропущенные даты 19-го и 20-го и вложить строки с нулями под вновь добавленными строками даты?

Вот фрагмент того, что я сделалкоторый возвращает ошибку значения: не может переиндексировать с дублированной оси.

enter image description here

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Вы можете использовать DataFrame.asfreq для переиндексации после удаления дубликатов, а затем добавления дубликатов данных и сортировки:

df['Date'] = pd.to_datetime(df['Date'].astype(str), format='%Y-%m-%d')
df2=df[df.duplicated('Date')].set_index('Date')
new_df=df.drop_duplicates('Date').set_index('Date').asfreq('D',fill_value=0)
new_df=new_df.append(df2).sort_index().reset_index()
print(new_df)

         Date  Article_ID Country_Code  Sold_Units
0  2017-08-17        1132           AT           1
1  2017-08-17        1132           AT           1
2  2017-08-18        1132           AT           1
3  2017-08-19           0            0           0
4  2017-08-20           0            0           0
5  2017-08-21        1132           AT           1
6  2017-08-22        1132           AT           1
7  2017-08-23           0            0           0
8  2017-08-24           0            0           0
9  2017-08-25           0            0           0
10 2017-08-26           0            0           0
11 2017-08-27           0            0           0
12 2017-08-28           0            0           0
13 2017-08-29           0            0           0
14 2017-08-30           0            0           0
15 2017-08-31           0            0           0
16 2017-09-01           0            0           0
17 2017-09-02           0            0           0
18 2017-09-03           0            0           0
19 2017-09-04           0            0           0
20 2017-09-05           0            0           0
21 2017-09-06        1132           AT           1
0 голосов
/ 20 октября 2019

Вы можете использовать:

df['Date'] = pd.to_datetime(df['Date'].astype(str), format='%Y-%m-%d',errors='coerce')

Вы не пропустите пропущенную дату, но она представлена ​​NaT.

У вас есть что-то вроде этого

       Date  Article_ID Outlet_Code  Sold_Units
 0 2017-08-17        1132          AT           1
 1 2017-08-18        1132          AT           1
 2        NaT        1132          AT           1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...