numpy 通过迭代列计算营业日

xytpbqjk  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(98)

我有一个看起来像这样的数据框。
x1c 0d1x的数据
我想计算事件日期和列中显示的月/日之间的工作天数。将NaTs转换为nans后的输出如下所示:



有谁知道如何最好地利用Pandas来实现这一目标吗?

5jdjgkvh

5jdjgkvh1#

假设日期已经是datetime类型 *,使用numpy.busday_count和广播/屏蔽:

import numpy as np

tmp = df.filter(regex=r'\d{4}-\d{2}')
df[tmp.columns] = np.where(tmp.notna(),
                           np.busday_count(df['Event_Date'].to_numpy(dtype='datetime64[D]')[:,None],
                                           tmp.fillna('0').to_numpy(dtype='datetime64[D]')),
                           np.nan)

字符串

  • 否则转换为cols = df.drop(columns='Account').columns ; df[cols] = df[cols].apply(pd.to_datetime, dayfirst=True)

输出量:

Account Event_Date  2023-01  2023-02  2023-03  2023-04  2023-05  2023-06  2023-07
0       A 2023-04-25    -77.0      NaN      NaN      NaN      NaN      NaN      NaN
1       B 2023-06-02      NaN      NaN      NaN     21.0     51.0      NaN      NaN
2       C 2023-04-25      NaN      NaN      NaN      NaN      7.0      NaN      NaN


使用的输入:

from pandas import Timestamp

df = pd.DataFrame({'Account': ['A', 'B', 'C'],
                   'Event_Date': [Timestamp('2023-04-25 00:00:00'), Timestamp('2023-06-02 00:00:00'), Timestamp('2023-04-25 00:00:00')],
                   '2023-01': [Timestamp('2023-01-06 00:00:00'), NaT, NaT],
                   '2023-02': [NaT, NaT, NaT],
                   '2023-03': [NaT, NaT, NaT],
                   '2023-04': [NaT, Timestamp('2023-07-01 00:00:00'), NaT],
                   '2023-05': [NaT, Timestamp('2023-08-12 00:00:00'), Timestamp('2023-05-04 00:00:00')],
                   '2023-06': [NaT, NaT, NaT],
                   '2023-07': [NaT, NaT, NaT]})

相关问题