it-swarm.com.de

Fügen Sie Daten zu Daten im Datenrahmen hinzu

Ich bin im Moment geschwächt. Ich bin mir sicher, dass mir etwas Einfaches fehlt, aber wie verschieben Sie eine Reihe von Daten um x Einheiten vorwärts? In meinem spezifischeren Fall möchte ich einer Datumsreihe innerhalb eines Datenrahmens 180 Tage hinzufügen.

Folgendes habe ich bisher:

import pandas, numpy, StringIO, datetime


txt = '''ID,DATE
002691c9cec109e64558848f1358ac16,2003-08-13 00:00:00
002691c9cec109e64558848f1358ac16,2003-08-13 00:00:00
0088f218a1f00e0fe1b94919dc68ec33,2006-05-07 00:00:00
0088f218a1f00e0fe1b94919dc68ec33,2006-06-03 00:00:00
00d34668025906d55ae2e529615f530a,2006-03-09 00:00:00
00d34668025906d55ae2e529615f530a,2006-03-09 00:00:00
0101d3286dfbd58642a7527ecbddb92e,2007-10-13 00:00:00
0101d3286dfbd58642a7527ecbddb92e,2007-10-27 00:00:00
0103bd73af66e5a44f7867c0bb2203cc,2001-02-01 00:00:00
0103bd73af66e5a44f7867c0bb2203cc,2008-01-20 00:00:00
'''
df = pandas.read_csv(StringIO.StringIO(txt))
df = df.sort('DATE')
df.DATE = pandas.to_datetime(df.DATE)
df['X_DATE'] = df['DATE'].shift(180, freq=pandas.datetools.Day)

Dieser Code erzeugt einen Typfehler. Als Referenz verwende ich:

Python 2.7.4 Pandas '0.12.0.dev-6e7c4d6' Numpy '1.7.1'

28
BigHandsome

Wenn ich Sie verstehe, möchten Sie eigentlich nicht shift, sondern einfach eine neue Spalte neben dem vorhandenen DATE erstellen, die 180 Tage später liegt. In diesem Fall können Sie timedelta verwenden:

>>> from datetime import timedelta
>>> df.head()
                                 ID                DATE
8  0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 00:00:00
0  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00
1  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00
5  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00
4  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00
>>> df["X_DATE"] = df["DATE"] + timedelta(days=180)
>>> df.head()
                                 ID                DATE              X_DATE
8  0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 00:00:00 2001-07-31 00:00:00
0  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00 2004-02-09 00:00:00
1  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00 2004-02-09 00:00:00
5  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00 2006-09-05 00:00:00
4  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00 2006-09-05 00:00:00

Hilft das jemandem?

40
DSM

Du könntest benutzen pd.DateOffset. Welches scheint schneller als timedelta zu sein.

In [930]: df['x_DATE'] = df['DATE'] + pd.DateOffset(days=180)

In [931]: df
Out[931]:
                                 ID       DATE     x_DATE
8  0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 2001-07-31
0  002691c9cec109e64558848f1358ac16 2003-08-13 2004-02-09
1  002691c9cec109e64558848f1358ac16 2003-08-13 2004-02-09
4  00d34668025906d55ae2e529615f530a 2006-03-09 2006-09-05
5  00d34668025906d55ae2e529615f530a 2006-03-09 2006-09-05
2  0088f218a1f00e0fe1b94919dc68ec33 2006-05-07 2006-11-03
3  0088f218a1f00e0fe1b94919dc68ec33 2006-06-03 2006-11-30
6  0101d3286dfbd58642a7527ecbddb92e 2007-10-13 2008-04-10
7  0101d3286dfbd58642a7527ecbddb92e 2007-10-27 2008-04-24
9  0103bd73af66e5a44f7867c0bb2203cc 2008-01-20 2008-07-18

Timings

Mittel

In [948]: df.shape
Out[948]: (10000, 3)

In [950]: %timeit df['DATE'] + pd.DateOffset(days=180)
1000 loops, best of 3: 1.51 ms per loop

In [949]: %timeit df['DATE'] + timedelta(days=180)
100 loops, best of 3: 2.71 ms per loop

Groß

In [952]: df.shape
Out[952]: (100000, 3)

In [953]: %timeit df['DATE'] + pd.DateOffset(days=180)
100 loops, best of 3: 4.16 ms per loop

In [955]: %timeit df['DATE'] + timedelta(days=180)
10 loops, best of 3: 20 ms per loop
21
Zero

Für zukünftige Leser, wenn Sie verschiedene Zeilen um unterschiedliche Beträge ändern möchten, müssen Sie stattdessen Pandas TimedeltaIndex) verwenden, um eine Reihe von Zeitleisten zu übergeben.

Beispielsweise möchte ich meine Daten möglicherweise auf den nächsten Berichtszeitraum verschieben, und jeder Datensatz könnte an einem anderen Wochentag gestartet worden sein.

import pandas as pd
days_to_shift = pd.TimedeltaIndex(6 - launch_df['launch_dt'].dt.dayofweek)
launch_df['launch_dt'] = launch_df['launch_dt'] + days_to_shift
13
dreyco676