Я застрял с этой проблемой несколько дней ... Я не знаю, как ее решить. У меня есть датафрейм с указателем в некоторых датах. Я хочу выбрать окно, равное количеству дней, например, 5 дней. Я хочу вернуть dataFrame с моими начальными датами в индексе и в первом столбце разницу дней между каждой датой в индексе и ближайшим днем в 5-дневном окне.

Давайте установим пример.

[In] Mydates
[Out] 
2017-04-04   
2017-04-03    
2017-03-31    
2017-03-30   
2017-03-29   
2017-03-28   
2017-03-27   
2017-03-24  
2017-03-23     
2017-03-21   

Я хочу обратно

func(window = 5)
    return MyNewdates
[out]         First column
2017-04-04   -5 [diff between 2017-04-04 and 5 days before or closest date in dataset from 5 days before (here 2017-03-30 ), so difference is 0 - 5 =] -5 

2017-04-03   -5  [diff between 2017-04-03 and 5 days before or closest date in dataset from 5 days before (here 2017-03-29), so difference is 0 - 5 =] -5 
2017-03-31    
2017-03-30   -6  [here, there is no 2017-03-25 (5 days before) so the closest date from my window is 2017-03-24 (6 days before), so the difference is 0 - 6 =] -6 

2017-03-29   -5  [diff between 2017-03-29 and 5 days before or closest date in dataset from 5 days before (here 2017-03-24), so difference is 0 - 5 =] -5 
2017-03-28   -5  [diff between 2017-03-29 and 5 days before or closest date in dataset from 5 days before (here 2017-03-23 ), so difference is 0 - 5 =] -5 
2017-03-27   -4  [diff between 2017-03-27 and 5 days before or closest date in dataset from 5 days before (here 2017-03-23 ), so difference is 0 - 4 =] -4
2017-03-24  NAN 
2017-03-23  NAN    
2017-03-21  NAN

Др...

Для этого я изменил все даты в днях. Есть ли другие способы? Я хочу, чтобы это вернуло мне разницу во времени.

Я надеюсь, что это понятно, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы!

Спасибо!!

1
user6457870 24 Апр 2017 в 11:04

2 ответа

Лучший ответ

Затем IIUC работает следующим образом:

In [141]:
import io
import pandas as pd
# read in data
t="""Dates
2017-04-04   
2017-04-03    
2017-03-31    
2017-03-30   
2017-03-29   
2017-03-28   
2017-03-27   
2017-03-24  
2017-03-23   
2017-03-22   
2017-03-21  """
df = pd.read_csv(io.StringIO(t), delim_whitespace=True, parse_dates=[0], index_col=[0])
# define a window func
def func(x, window):
    prev = x - pd.DateOffset(window)
    if df.index.isin([prev]).any() == True:
        return -window
    elif (prev < df.index).all():
        return np.NaN
    else:
        diff = (df.index - prev).to_series().abs() 
        diff_idx = diff.index.get_loc(diff.argmin())
        return - ((x - (x - df.iloc[diff_idx]).name).days)

df.index.to_series().apply(lambda x: func(x, 5))
Out[141]:

Dates
2017-04-04   -5.0
2017-04-03   -5.0
2017-03-31   -4.0
2017-03-30   -6.0
2017-03-29   -5.0
2017-03-28   -5.0
2017-03-27   -5.0
2017-03-24    NaN
2017-03-23    NaN
2017-03-22    NaN
2017-03-21    NaN
Name: Dates, dtype: float64
2
EdChum - Reinstate Monica 24 Апр 2017 в 12:13

Вот решение мысли о:

def date_dif(x, dates, window):

    try:
        return (x - dates[dates <= x - pd.DateOffset(window)][0]).days
    except:
        return None

Тогда вы можете использовать лямбду:

df['time_dif'] = df.index.map(lambda x: date_dif(x, df.index, 5))

Для получения дополнительной информации я создал свой df следующим образом:

import pandas as pd
import datetime as dt

start_date = dt.datetime(2017,3,21)
end_date = dt.datetime(2017,4,4)

delta = end_date - start_date

dates = [start_date + dt.timedelta(days=i) for i in range(delta.days +1)]


df = pd.DataFrame(index=dates)
df.sort_index(ascending=False, inplace=True)

Надеюсь это поможет.

0
McN 24 Апр 2017 в 09:17