python 列表中每个月的工作日
Workdays for each month in list in python
python 这里是新手。
我正在尝试创建一个 df,其中 1 列是我在下面的字典中创建的月份 'YYYY-MM'(将不胜感激有关使用代码生成此内容的提示)。
我一直在尝试使用 month_list.
填充工作日列
import pandas as pd
df = pd.DataFrame({'month_list':['2019-01', '2019-02', '2019-03', '2019-04']})
df['weekdays'] = ''
我试过这段代码,但这只适用于第一行。 (我明白这是为什么,我只是不知道正确完成每一行的最佳方法)
df.weekdays = np.busday_count(month_list[0], month_list[0+1])
df
通过 Series.dt.strftime
将值转换为日期时间和字符串,然后加上一个月并传递给 np.busday_count
:
df = pd.DataFrame({'month_list':['2019-01', '2019-02', '2019-03', '2019-04']})
month_list = pd.to_datetime(df['month_list'])
a = month_list.dt.strftime('%Y-%m-%d')
b = (month_list + pd.offsets.DateOffset(months=1)).dt.strftime('%Y-%m-%d')
df['weekdays'] = np.busday_count(a, b)
print (df)
month_list weekdays
0 2019-01 23
1 2019-02 20
2 2019-03 21
3 2019-04 22
只有numpy解决方案:
month_list = pd.to_datetime(df['month_list'])
a = month_list.to_numpy().astype('datetime64[M]')
b = a + np.array([1], dtype='timedelta64[M]')
df['weekdays'] = np.busday_count(a, b)
print (df)
month_list weekdays
0 2019-01 23
1 2019-02 20
2 2019-03 21
3 2019-04 22
from pandas.tseries.offsets import MonthEnd
df = pd.DataFrame({'month_list': pd.date_range('2019-01', '2019-12', freq='MS')})
df['weekdays'] = np.busday_count(df.month_list.values.astype('datetime64[D]'), (df.month_list + MonthEnd(0)).values.astype('datetime64[D]')) + 1
结果:
month_list weekdays
0 2019-01-01 23
1 2019-02-01 20
2 2019-03-01 22
3 2019-04-01 22
4 2019-05-01 23
5 2019-06-01 21
6 2019-07-01 23
7 2019-08-01 23
8 2019-09-01 21
9 2019-10-01 23
10 2019-11-01 22
11 2019-12-01 22
python 这里是新手。 我正在尝试创建一个 df,其中 1 列是我在下面的字典中创建的月份 'YYYY-MM'(将不胜感激有关使用代码生成此内容的提示)。 我一直在尝试使用 month_list.
填充工作日列import pandas as pd
df = pd.DataFrame({'month_list':['2019-01', '2019-02', '2019-03', '2019-04']})
df['weekdays'] = ''
我试过这段代码,但这只适用于第一行。 (我明白这是为什么,我只是不知道正确完成每一行的最佳方法)
df.weekdays = np.busday_count(month_list[0], month_list[0+1])
df
通过 Series.dt.strftime
将值转换为日期时间和字符串,然后加上一个月并传递给 np.busday_count
:
df = pd.DataFrame({'month_list':['2019-01', '2019-02', '2019-03', '2019-04']})
month_list = pd.to_datetime(df['month_list'])
a = month_list.dt.strftime('%Y-%m-%d')
b = (month_list + pd.offsets.DateOffset(months=1)).dt.strftime('%Y-%m-%d')
df['weekdays'] = np.busday_count(a, b)
print (df)
month_list weekdays
0 2019-01 23
1 2019-02 20
2 2019-03 21
3 2019-04 22
只有numpy解决方案:
month_list = pd.to_datetime(df['month_list'])
a = month_list.to_numpy().astype('datetime64[M]')
b = a + np.array([1], dtype='timedelta64[M]')
df['weekdays'] = np.busday_count(a, b)
print (df)
month_list weekdays
0 2019-01 23
1 2019-02 20
2 2019-03 21
3 2019-04 22
from pandas.tseries.offsets import MonthEnd
df = pd.DataFrame({'month_list': pd.date_range('2019-01', '2019-12', freq='MS')})
df['weekdays'] = np.busday_count(df.month_list.values.astype('datetime64[D]'), (df.month_list + MonthEnd(0)).values.astype('datetime64[D]')) + 1
结果:
month_list weekdays
0 2019-01-01 23
1 2019-02-01 20
2 2019-03-01 22
3 2019-04-01 22
4 2019-05-01 23
5 2019-06-01 21
6 2019-07-01 23
7 2019-08-01 23
8 2019-09-01 21
9 2019-10-01 23
10 2019-11-01 22
11 2019-12-01 22