Chcę odjąć daty w „A” od dat w „B” i dodać nową kolumnę z różnicą.
df
A B
one 2014-01-01 2014-02-28
two 2014-02-03 2014-03-01
Próbowałem wykonać następujące czynności, ale pojawia się błąd, gdy próbuję uwzględnić to w pętli for ...
import datetime
date1=df['A'][0]
date2=df['B'][0]
mdate1 = datetime.datetime.strptime(date1, "%Y-%m-%d").date()
rdate1 = datetime.datetime.strptime(date2, "%Y-%m-%d").date()
delta = (mdate1 - rdate1).days
print delta
Co powinienem zrobić?
python
pandas
date-difference
Jase Villam
źródło
źródło
pd.offsets.Day(1)
(z „s”). Ja też zwykle to(df['A'] - df['B']) / pd.offsets.Day(-1)
(df['A'] - df['B']) / np.timedelta64(-1, 'D')
powodów, których nie do końca rozumiem..dt.days
atrybut, który powinien być zdecydowanie preferowany.Aby usunąć element tekstowy „days”, możesz również skorzystać z akcesorium dt () dla serii: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.html
Więc,
df[['A','B']] = df[['A','B']].apply(pd.to_datetime) #if conversion required df['C'] = (df['B'] - df['A']).dt.days
która zwraca:
A B C one 2014-01-01 2014-02-28 58 two 2014-02-03 2014-03-01 26
źródło
df['C'] = (df['B'] - df['A']).dt.days
nie zadziałało i musiałem skorzystaćdf['C'] = (df['B'] - df['A']).days
. Masz jakiś pomysł, dlaczego mój nie podał liczby dni zgodnie z oczekiwaniami?datetime64[ns]
dokładniej). Kiedy to zrobiłemdf['C'] = (df['B'] - df['A']).dt.days
, pojawił się błąd atrybutu, który mówił o błędzie AttributeError: Obiekt „Timedelta” nie ma atrybutu „dt” , więc próbowałem df [„C”] = (df [„B”] - df [„A”]). dni, które dały mi pożądaną odpowiedź. (Oczywiście używam własnej ramki danych, a nie tej z powyższego przykładu. A może dlatego, że mam czas na randkę, a nie jak w2018-09-24 10:17:18.800277
)Zrozumienie listy jest najlepszym sposobem na najbardziej Pythonic (i najszybszy) sposób, aby to zrobić:
[int(i.days) for i in (df.B - df.A)]
Jeśli Twoje kolumny nie są w formacie daty i godziny. Krótsza składnia to:
df.A = pd.to_datetime(df.A)
źródło
Co powiesz na to:
times['days_since'] = max(list(df.index.values)) times['days_since'] = times['days_since'] - times['months'] times
źródło