如何添加一个数据框日期列,该列是由现有日期列和条件列计算得出的?

3

我有以下数据框。


日期的类型是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"在市场收盘后",则将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)
3个回答

3
生成一个布尔掩码,并使用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

太棒了。谢谢 coldspeed。 - GollyJer

1

你可以使用 np.where

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

这个答案有详细的解释。


谢谢Sach。我发誓我尝试过这种方法,但它没起作用。 对于任何在玩的人,这个方法是有效的,但会抛出一个警告。 /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进行操作。请参考我的回答。 - cs95

1
你可以像这样创建一个while循环来遍历announce_time...
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

谢谢Drew。这种方法在多个条件下也很有用。 - GollyJer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接