在数据框中添加日期到日期

Big*_*ome 20 python datetime pandas

我此刻陷入困境.我确信我错过了一些简单的东西,但是你如何通过x单位向前移动一系列日期?在我更具体的情况下,我想在数据框中的日期系列中添加180天.

这是我到目前为止:

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)
Run Code Online (Sandbox Code Playgroud)

此代码生成类型错误.作为参考我正在使用:

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

DSM*_*DSM 42

如果我理解你,你实际上并不想要shift,你只想在DATE180天后的现有新栏旁边创建一个新栏目.在这种情况下,您可以使用timedelta:

>>> 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
Run Code Online (Sandbox Code Playgroud)

这对你有帮助吗?


Zer*_*ero 25

你可以用pd.DateOffset.这似乎比...更快timedelta.

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
Run Code Online (Sandbox Code Playgroud)

计时

介质

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


dre*_*676 16

对于未来的读者,如果你想以不同的量来改变不同行,你就需要使用熊猫TimedeltaIndex,而不是通过一系列timedeltas的.

例如,我可能希望将数据转移到最近的报告期间,并且每条记录可能已在一周的不同日期开始.

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
Run Code Online (Sandbox Code Playgroud)

  • 要添加“天”(而不是纳秒,这是我的测试中的默认值),您可能需要添加单位arg,如下所示:`days_to_shift = pd.TimedeltaIndex(6-launch_df [“ launch_dt”]。dt .dayofweek,unit =“ D”)` (3认同)