无法根据条件w / np在熊猫中创建新的时间戳列。

时间:2018-10-16 16:00:00

标签: python pandas datetime dataframe

在编写脚本以自动执行报告编译的过程中,我试图基于条件使用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变量,行的Month1被用作创建基础的基础。时间戳记(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创建的基础),所以我不确定是什么原因造成的。

1 个答案:

答案 0 :(得分:0)

有几个问题:

  1. 您应使用pd.to_datetime进行矢量化转换,而不要使用pd.Timestamp
  2. numpy.where返回一个NumPy数组,该数组与Pandas datetime系列不同。但是您可以将数组提供给pd.to_datetime
  3. 您应该避免在单个序列中组合具有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