在编写脚本以自动执行报告编译的过程中,我试图基于条件使用np.where()创建一列Timestamps。逻辑如下:
df['StartMonth'] = np.where(
chng['Count'] == 1, pd.Timestamp(
int(year), chng['Month'].astype(int), 1), str('')
)
DataFrame是被视为添加或删除的员工列表,其中chng['Count']
用作标志,显示+1作为添加,而-1显示为删除。因此,在要添加任何员工的地方,创建StartMonth
系列,其中固定的year
变量,行的Month
和1
被用作创建基础的基础。时间戳记(year
和chng ['Month']都是字符串,因此在条件中将它们强制转换为整数)。对于每个True
行,该函数的输出如下:
Month Count StartMonth
0 1 1 1970-01-01 00-00-01.000002+00019:00:01
1 1 1 1970-01-01 00-00-01.000002+00019:00:01
2 4 1 1970-01-01 00-00-01.000002+00019:00:01
3 5 1 1970-01-01 00-00-01.000002+00019:00:01
4 10 1 1970-01-01 00-00-01.000002+00019:00:01
我已经尝试过使用year
和chng ['Month']在条件之前将其转换为整数,并且得到了相同的结果。唯一有效的方法是将chng ['Month']替换为其他任意数字,这使我相信这是问题所在。我已经使用np.where()完成了许多其他条件,这些条件使用了DataFrame中另一个Series的值(尽管不是作为Timestamp创建的基础),所以我不确定是什么原因造成的。>
答案 0 :(得分:0)
有几个问题:
pd.to_datetime
进行矢量化转换,而不要使用pd.Timestamp
。numpy.where
返回一个NumPy数组,该数组与Pandas datetime
系列不同。但是您可以将数组提供给pd.to_datetime
。datetime
值的字符串。选一个。在这里,请使用''
而不是pd.NaT
来确保您的系列保留为datetime
。这是一个示例解决方案:
year = 2018
s = str(year) + '-' + df['Month'].astype(str)
df['StartMonth'] = pd.to_datetime(np.where(df['Count'] == 1, s, pd.NaT))
print(df)
Month Count StartMonth
0 1 1 2018-01-01
1 1 1 2018-01-01
2 4 1 2018-04-01
3 5 1 2018-05-01
4 10 1 2018-10-01