【问题标题】:Add days to dates in dataframe将日期添加到数据框中的日期
【发布时间】:2013-04-29 10:38:31
【问题描述】:

我现在被困住了。我确信我遗漏了一些简单的东西,但是你如何将一系列日期向前移动 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)

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

Python 2.7.4 熊猫'0.12.0.dev-6e7c4d6' numpy '1.7.1'

【问题讨论】:

  • 请将错误与回溯一起发布,以便我们查看您的问题。此外,如果您想添加 180 个日期,您希望这些行的 ID 是什么? Nan?

标签: python pandas datetime


【解决方案1】:

如果我理解你的话,你实际上并不想要shift,你只是想在现有的DATE 旁边创建一个新列,即 180 天后。在这种情况下,您可以使用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

这有帮助吗?

【讨论】:

    【解决方案2】:

    您可以使用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
    

    时间

    中等

    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
    

    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
    

    【讨论】:

    • 奇怪,因为 DateOffset 本身使用 timedelta 会更快?
    【解决方案3】:

    对于未来的读者,如果您想以不同的数量更改不同的行,您将需要使用 Pandas TimedeltaIndex 来传递一系列时间增量。

    例如,我可能想将我的数据转移到最近的报告期,而每条记录可能开始于一周中的不同日期。

    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
    

    【讨论】:

    • 要添加 days(而不是纳秒,这是我测试中的默认值),您可能需要添加一个单位 arg,如下所示:days_to_shift = pd.TimedeltaIndex(6 - launch_df["launch_dt"].dt.dayofweek, unit="D")
    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-02-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多