замена дат дат с использованием диапазона дат - PullRequest
1 голос
/ 19 февраля 2020

У меня есть датафрейм с двумя столбцами: дата и количество пассгеров. Столбец даты имеет даты в диапазоне от 1950 до 2019. Однако некоторые даты записываются как 1600, что, безусловно, является ошибкой. Когда я пытаюсь изменить объект даты на datetimeindex, я получаю ошибку выхода за границы, которая имеет смысл. Поэтому я решил сначала заменить 1600 дат значениями nan вместо

new_set=drop_dup.replace(to_replace =["1610-01-01", "1610/01/01"], 
             value = np.nan)

Это было просто временное исправление для изменения объекта даты в datetimeindex. Даты с 1600 в качестве значения около 27, и я не хотел менять их на одно значение. Вместо этого я хочу заменить эти значения nan определенным диапазоном дат, то есть с 1955 по 1982 год. Приведенный ниже код не работает, но я стремился к чему-то подобному

new_set=drop_dup.replace(to_replace =np.nan, value = pd.date_range(start='1-1-1955', end='1-1-1982', freq='12M')

Так что даты 27 1600 должны быть в диапазоне от период с 1955 по 1982

1 Ответ

0 голосов
/ 19 февраля 2020

Пример данных:

df = pd.DataFrame({'date': pd.to_datetime([np.nan] * 10 + 
                                          ['2000-01-31','2001-01-31','2002-01-31'])})
print (df)
         date
0         NaT
1         NaT
2         NaT
3         NaT
4         NaT
5         NaT
6         NaT
7         NaT
8         NaT
9         NaT
10 2000-01-31
11 2001-01-31
12 2002-01-31

Первая идея - создать маску для отсутствующих данных и добавить date_range без конечного параметра, но с period числом пропущенных значений, созданным sum:

m = df['date'].isna()
df.loc[m, 'date'] = pd.date_range(start='1-1-1955', freq='12M', periods=m.sum())
print (df)
         date
0  1955-01-31
1  1956-01-31
2  1957-01-31
3  1958-01-31
4  1959-01-31
5  1960-01-31
6  1961-01-31
7  1962-01-31
8  1963-01-31
9  1964-01-31
10 2000-01-31
11 2001-01-31
12 2002-01-31

Другая идея состоит в том, чтобы удалить start, и к параметру end добавляется минимальная дата, а к периоду также учитывается число пропущенных значений:

m = df['date'].isna()
df.loc[m, 'date'] = pd.date_range(end=df['date'].min(), freq='12M', periods=m.sum())
print (df)
         date
0  1991-01-31
1  1992-01-31
2  1993-01-31
3  1994-01-31
4  1995-01-31
5  1996-01-31
6  1997-01-31
7  1998-01-31
8  1999-01-31
9  2000-01-31
10 2000-01-31
11 2001-01-31
12 2002-01-31
...