df со столбцами дат добавляет столбец продолжительности между текущей и следующей датой строки - PullRequest
1 голос
/ 15 мая 2019

предположим, у меня есть df дат:

date          quantity
2015-01-01    100
2016-01-01    500
2016-01-05    100

, и я хочу добавить еще один новый столбец о времени между датой текущей строки и датой следующей строки.Если последняя строка, обратитесь к сегодняшней дате.

date          quantity    days
2015-01-01    100         365
2016-01-01    500         4
2016-01-05    100         1227

Обратите внимание, что: 1227 - это количество дней с 2016-01-05 по 2019-05-16 (сегодня).Я могу сделать это с помощью петель, просто интересно, смогу ли я использовать панд, чтобы сделать это чисто.

Ответы [ 3 ]

2 голосов
/ 15 мая 2019

Если мы вставим его в одну строку

df['New']=df.date.append(pd.Series(pd.datetime.now())).diff().dropna().dt.days.values
df
Out[102]: 
        date  quantity   New
0 2015-01-01       100   365
1 2016-01-01       500     4
2 2016-01-05       100  1226
0 голосов
/ 15 мая 2019

Найти разницу и заполнить,

df.loc[:, 'diff'] = np.abs(df.date-df.date.shift(-1)).dt.days
df['diff'] = df['diff'].fillna(np.abs(df.date-pd.Timestamp.now()).dt.days)



    date        quantity    diff
0   2015-01-01  100         365.0
1   2016-01-01  500         4.0
2   2016-01-05  100         1226.0
0 голосов
/ 15 мая 2019

Вы можете сдвинуть и использовать dt-аксессор для результата:

In [11]: df.date - df.date.shift()
Out[11]:
0        NaT
1   365 days
2     4 days
Name: date, dtype: timedelta64[ns]

In [12]: (df.date - df.date.shift()).dt.days
Out[12]:
0      NaN
1    365.0
2      4.0
Name: date, dtype: float64

In [13]: (df.date - df.date.shift()).dt.days.fillna(0)
Out[13]:
0      0.0
1    365.0
2      4.0
Name: date, dtype: float64

сдвиг вверх, чтобы получить тот же результат, который вы хотели:

In [14]: (df.date.shift(-1) - df.date).dt.days.fillna(0)
Out[14]:
0    365.0
1      4.0
2      0.0
Name: date, dtype: float64

Какпрокомментировал, что вы можете сделать это чище, используя diff:

In [21]: -df.date.diff(-1).fillna(0)
Out[21]:
0   365 days
1     4 days
2     0 days
Name: date, dtype: timedelta64[ns]

In [22]: -df.date.diff(-1).fillna(0).dt.days
Out[22]:
0    365
1      4
2      0
Name: date, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...