从Pandas中的日期列获取每个项目的月数

798qvoo8  于 2023-02-07  发布在  其他
关注(0)|答案(2)|浏览(198)

我有一个包含两列的df:日期产品,某些产品可能在某些月份可用,而在其他月份不可用,我需要获得每个产品的可用月数。

In [1]: data = {'Date': ['04-02-2022', '04-03-2022', '04-29-2022', '04-30-2022','05-02-2022','05-04-2022','05-20-2022','05-25-2022',
                     '05-30-2022','06-02-2022','06-05-2022','06-10-2022','06-12-2022','06-25-2022','06-30-2022','07-02-2022',
            '07-02-2022','07-05-2022','07-08-2022','07-15-2022','08-02-2022','08-12-2022','08-15-2022'],
            'Products': ['prod1', 'prod1', 'prod2', 'prod3','prod1','prod2','prod1','prod3','prod3','prod1','prod2','prod3','prod2',
                        'prod3','prod1','prod2','prod2','prod2','prod3','prod3','prod3','prod3','prod3']}
        df = pd.DataFrame(data)
    
        df['Date'] = df['Date'].astype('datetime64')

当我使用下面的print()我得到每个产品的月数。

In [2]: for product in df['Products'].unique():
            num_months = df.loc[df.Products==product].Date.dt.to_period('M')
            num_months = num_months.unique()
            num_months = num_months.size
    
            print(num_months)  
Out [3]: 3
         4
         5

Prod1在3个不同的月份可用,prod2在4个不同的月份可用,prod3在5个不同的月份可用。

但是,我尝试创建一个函数,我可以给予它一个参数,并返回每个产品的可用月数,该函数只返回prod3的最后一个数字计数。

In [4]: def months_count(product):
        for product in df['Products'].unique():
            num_of_months = df.loc[df.Products==product].Date.dt.to_period('M')
            num_of_months = num_of_months.unique()
            num_of_months = num_of_months.size
    
        return num_of_months

In [5]: months_count('prod1')
Out[5]: 5

这里的out只是prod3的月份计数,我做错了什么?

wf82jlnq

wf82jlnq1#

不需要函数,只需对句点使用groupby.nunique

out = df['Date'].dt.to_period('M').groupby(df['Products']).nunique()

输出:

Products
prod1    3
prod2    4
prod3    5
Name: Date, dtype: int64
3qpi33ja

3qpi33ja2#

您在所有产品上定义的months_count循环,它应该只使用传递的product作为参数。
下面是您需要的months_count函数的正确版本:

def months_count(product):
    num_of_months = df.loc[df.Products==product].Date.dt.to_period('M')
    num_of_months = num_of_months.unique()
    num_of_months = num_of_months.size

    return num_of_months

相关问题