Python - возьмите разницу во времени с первой даты в столбце

Учитывая столбец даты, я хочу создать еще один столбец diff, который подсчитывает, сколько дней отделяется от первой даты.

date                    diff
2011-01-01 00:00:10      0
2011-01-01 00:00:11      0.000011 days
2011-02-01 00:00:11      30.000011 days 
2013-02-01 00:00:11      395.000011 days
2014-02-01 00:00:11      760.000011 days

Даты указаны в формате datetime. Что я пробовал до сих пор:

df = df.sort_values(['date'], ascending=True)
df.set_index('date', inplace = True)
first = df.index[0]
df['diff'] = (first - df.index.shift()).fillna(0)
0
0
569
4

Ответы 4

Вы можете использовать этот подход без установки нового индекса

Необработанный фрейм данных

df
                 date        diff
0 2011-01-01 00:00:10    0.000000
1 2011-01-01 00:00:11    0.000011
2 2011-02-01 00:00:11   30.000011
3 2013-02-01 00:00:11  395.000011
4 2014-02-01 00:00:11  760.000011

вариант ответа

df['diff_new'] = df['date'] - df.loc[0,'date']

                 date        diff           diff_new
0 2011-01-01 00:00:10    0.000000    0 days 00:00:00
1 2011-01-01 00:00:11    0.000011    0 days 00:00:01
2 2011-02-01 00:00:11   30.000011   31 days 00:00:01
3 2013-02-01 00:00:11  395.000011  762 days 00:00:01
4 2014-02-01 00:00:11  760.000011 1127 days 00:00:01

Кстати, я получаю разные даты, которые вы показываете в необработанных данных для 3-й строки. Можно вручную сравнить с этот онлайн-инструмент для расчета разницы дат в днях.

Мой первый ответ здесь был неправильным, поскольку он давал разницу между последовательными строками. Я обновил это. Приносим извинения за недоразумение. Надеюсь это поможет.

edesz 26.10.2018 06:17

ты можешь попробовать

df['diff'] = df.date - df.date.min()

df
                 date               diff
0 2011-01-01 00:00:10    0 days 00:00:00
1 2011-01-01 00:00:11    0 days 00:00:01
2 2011-02-01 00:00:11   31 days 00:00:01
3 2013-02-01 00:00:11  762 days 00:00:01
4 2014-02-01 00:00:11 1127 days 00:00:01

@nimrodz min() может завершиться ошибкой, если есть другие даты, меньшие, чем первая. Лучше просто использовать df.date - df.date[0]

Sai Kumar 26.10.2018 05:56

Добавлен пример @pygo df

nimrodz 26.10.2018 06:02

@SaiKumar min() должен работать здесь, потому что df.date[0] - это минимальная дата из-за сортировки значений df.sort_values(['date'], ascending=True)

nimrodz 26.10.2018 06:05

Это то, что вы попробуете ..

>>> df
                  date
0  2011-01-01 00:00:10
1  2011-01-01 00:00:11
2  2011-02-01 00:00:11
3  2013-02-01 00:00:11
4  2014-02-01 00:00:11

Сначала преобразуйте их в метки времени, чтобы данные можно было правильно оформить. После преобразования просто измените DataFrame:

>>> df2 = df.apply(lambda x: [pd.Timestamp(ts) for ts in x])
>>> df['diff']  = (df2 - df2.shift()).fillna(0)
>>> df
                  date              diff
0  2011-01-01 00:00:10   0 days 00:00:00
1  2011-01-01 00:00:11   0 days 00:00:01
2  2011-02-01 00:00:11  31 days 00:00:00
3  2013-02-01 00:00:11 731 days 00:00:00
4  2014-02-01 00:00:11 365 days 00:00:00

Вот что я бы сделал, чтобы получить дни в виде чисел с плавающей запятой:

dates = pd.to_datetime(df.date) # make sure we are working with dates and not strings
df["diff"] = (dates - dates[0]).apply(lambda x: x.total_seconds() / 86400))

Полученный df:

                  date         diff
0  2011-01-01 00:00:10     0.000000
1  2011-01-01 00:00:11     0.000012
2  2011-02-01 00:00:11    31.000012
3  2013-02-01 00:00:11   762.000012
4  2014-02-01 00:00:11  1127.000012

Другие вопросы по теме