Получить даты на основе строки столбца в пандах - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть датафрейм для панд:

id       age
001      1 hour
002      2 hours
003      2 days
004      4 days

Возраст относится к тому, как долго элемент был в базе данных. Что мне нравится делать, так это печатать дату добавления элемента в базу данных.

Так что, если в столбце age содержится строка "hour" или "hours", я хочу напечатать текущую дату, а если нет, вычесть текущую дату по количеству дней.

Желаемый результат должен выглядеть следующим образом:

id       age          insertion_date
001      1 hour       2018-09-18
002      2 hours      2018-09-18
003      2 days       2018-09-16
004      4 days       2018-09-14

Я использую Python 2.7, и до сих пор это то, чего я достиг.

import pandas as pd
from datetime import date

for index, row in df.iterrows():
    age = row["age"]
    if "days" in age:
       # Remove days and convert data type of age column 
       df["age"] = df["age"].astype("str").str.replace('[^\d\.]', '')
       # deduct current date by number of days
       df["insertion_date"] = df["age"].astype("int64").apply(lambda x: date.today() - timedelta(x))
     else:
       # print current date
       df["insertion_date"] = date.today()

Вывод кода выше выглядит следующим образом:

id       age          insertion_date
001      1            2018-09-17
002      2            2018-09-16
003      2            2018-09-16
004      4            2018-09-14

Проблема с этим кодом заключается в том, что даже когда в столбце age присутствует строка "hour" или "hours", текущая дата не добавляется в inserttion_date колонка.

Был бы признателен, если бы кто-то мог указать, где я ошибся с этим кодом, чтобы я мог исправить его, чтобы получить желаемый результат, т.е. он добавит текущую дату в столбец inserttion_date , если строка "час" или «часы» присутствует в столбце age , в противном случае вычтите текущую дату из числа дней в столбце age и добавьте дату к inserttion_date колонка.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать Timestamp.floor, вычитаемое из timedelta с, созданного to_timedelta и TimedeltaIndex.floor:

df['new'] = pd.Timestamp.today().floor('D') - pd.to_timedelta(df['age']).dt.floor('D')
print (df)
   id      age        new
0   1   1 hour 2018-09-18
1   2  2 hours 2018-09-18
2   3   2 days 2018-09-16
3   4   4 days 2018-09-14

print (df['new'].dtypes)
datetime64[ns]
0 голосов
/ 18 сентября 2018

Давайте немного поработаем с мелкими временами:

df['insertion_date'] = (
    pd.to_datetime('today') - pd.to_timedelta(df.age).dt.floor('D')).dt.date

df
   id      age insertion_date
0   1   1 hour     2018-09-18
1   2  2 hours     2018-09-18
2   3   2 days     2018-09-16
3   4   4 days     2018-09-14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...