Изменение года в DatetimeIndex в pandas dataframe [дубликат]

Другой способ выполнения задания - использовать аналитическую функцию MAX () в предложении OVER PARTITION

SELECT t.*
  FROM
    (
    SELECT id
          ,rev
          ,contents
          ,MAX(rev) OVER (PARTITION BY id) as max_rev
      FROM YourTable
    ) t
  WHERE t.rev = t.max_rev 

. Другое решение OVER PARTITION, уже зарегистрированное в этом сообщении, -

SELECT t.*
  FROM
    (
    SELECT id
          ,rev
          ,contents
          ,ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) rank
      FROM YourTable
    ) t
  WHERE t.rank = 1 

Этот 2 SELECT хорошо работает на Oracle 10g.

13
задан 0nir 1 July 2015 в 19:14
поделиться

3 ответа

Вы можете использовать DateOffset для достижения этого:

In [15]:    
df['NEW_DATE'] = df['ACC_DATE'].apply(lambda x: x - pd.DateOffset(years=1))
df

Out[15]:
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12

update

Глядя на этот вопрос через 3 года, используя apply, вы можете просто сделать:

In[88]:
df['NEW_DATE'] = df['ACC_DATE'] - pd.DateOffset(years=1)
df

Out[88]: 
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12

, который является векторизованной операцией

30
ответ дан EdChum 27 August 2018 в 09:18
поделиться

Использовать DateOffset :

df["NEW_DATE"] = df["ACC_DATE"] - pd.offsets.DateOffset(years=1)
print (df)
        ACC_DATE   NEW_DATE
index                      
538   2006-04-07 2005-04-07
550   2006-04-12 2005-04-12
7
ответ дан jezrael 27 August 2018 в 09:18
поделиться

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

df["NEW_DATE"] = df["ACC_DATE"] - pd.Timedelta(days=365) 

Или заменить:

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x.replace(year=x.year - 1))

Но ни один из них не будет ловить високосные годы, чтобы вы могли использовать dateutil.relativedelta:

from dateutil.relativedelta import  relativedelta

df["NEW_DATE"] = df["ACC_DATE"].apply(lambda x: x - relativedelta(years=1))
8
ответ дан Padraic Cunningham 27 August 2018 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: