【问题标题】:How to add a dataframe date column calculated from an existing date column and a criteria column?如何添加从现有日期列和条件列计算的数据框日期列?
【发布时间】:2019-04-10 10:31:21
【问题描述】:

我有以下数据框。
日期是dtype='datetime64[ns, UTC]'

    announce_date  announce_time
0   2013-01-23     After Market Close
1   2013-04-23     Before Market Open
2   2013-07-20     After Market Close

如果announce_time 是"After Market Close",我如何创建一个将
announce_date 偏移1 的新列。

    announce_date  announce_time          impact_date
0   2013-01-23     After Market Close     2013-01-24
1   2013-04-23     Before Market Open     2013-04-23
2   2013-07-20     After Market Close     2013-07-21

我可以做一个偏移日期列,但还没有弄清楚如何应用条件。

import pandas as pd

df['impact_date'] = df['announce_date'] + pd.DateOffset(days=1)

【问题讨论】:

    标签: python pandas datetime dataframe timedelta


    【解决方案1】:

    使用pd.to_timedelta 生成一个布尔掩码并从中生成偏移量。

    # Convert "announce_date" to datetime if not already done.
    # df['announce_date'] = pd.to_datetime(df['announce_date'], errors='coerce')
    # Now calculate the offset.
    offset = pd.to_timedelta(
        df['announce_time'].eq("After Market Close").astype(int), unit='D')    
    df['impact_date'] = df['announce_date'] + offset
    
    print(df)
      announce_date       announce_time impact_date
    0    2013-01-23  After Market Close  2013-01-24
    1    2013-04-23  Before Market Open  2013-04-23
    2    2013-07-20  After Market Close  2013-07-21
    

    【讨论】:

    • 太棒了。谢谢冷速。 ?
    【解决方案2】:

    您可以使用np.where

    df['impact_date'] = df['announce_date'] + np.where(df['announce_time']=="After Market Close",pd.DateOffset(days=1),pd.DateOffset(days=0))

    This answer有详细解释。

    【讨论】:

    • 谢谢萨赫。我发誓我尝试过这种方法,但没有奏效。 ? 对于任何玩此作品但会发出警告的人。 /usr/local/lib/python2.7/dist-packages/pandas/core/ops.py:477: PerformanceWarning: Adding/subtracting array of DateOffsets to Series not vectorized "Series not vectorized", PerformanceWarning)
    • @GollyJer 如果要生成一系列时间增量,推荐的方法是使用pd.to_timedelta。看我的回答。
    【解决方案3】:

    你可以像这样创建一个遍历announce_time的while循环......

    count = 0
    list1 = []
    while count != len(df):
        if df.iloc[count,1] == 'After Market Close':
            list1.append(df.iloc[count,0] + pd.DateOffset(days=1))
            count += 1
        else:
            list1.append(df.iloc[count,0])
            count += 1
    
    df['impact_date'] = list1
    

    【讨论】:

    • 谢谢德鲁。这种方法也适用于多个标准。
    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2022-12-13
    • 2021-12-16
    • 2021-02-01
    • 2019-02-07
    相关资源
    最近更新 更多