按年份过滤特定列

Filter certain column by year

我有要分组的数据,之后我想按当年过滤它。

df['PERIOD'] = pd.to_datetime(df['PERIOD'], format='%Y%m', errors='coerce').dt.strftime('%Y/%m')
groupedResult = df.groupby('PERIOD', dropna=True)['ACTUALS'].sum().reset_index()

我试过添加这一行

groupedResult = groupedResult[groupedResult['PERIOD'].dt.year == datetime.today().year]

但是得到

AttributeError: Can only use .dt accessor with datetimelike values

我做错了什么?

示例数据集:

import pandas as pd

data = {'PERIOD':['202201','202201','202201','202201','202202','202202','202203'], 'ACTUALS':[10,20,30,40,50,60,70]}
    
df = pd.DataFrame(data)
print("BEFORE:")

What I am doing wrong?

这里

df['PERIOD'] = pd.to_datetime(df['PERIOD'], format='%Y%m', errors='coerce').dt.strftime('%Y/%m')

您正在将字符串形式的 PERIOD 转换为类似日期时间的类型,后者又被转换(格式化)为字符串,因此您

AttributeError: Can only use .dt accessor with datetimelike values

因为 PERIOD 在那一刻保持字符串。

考虑将 PERIOD 转换为 datetime-like ,而不 进一步转换为字符串。您可能会发现 pd.Grouper 对于此任务很有用,请考虑以下示例,该示例计算每个月的 ACTUAL 总和 (freq='M')

import pandas as pd

data = {'PERIOD':['202201','202201','202201','202201','202202','202202','202203'], 'ACTUALS':[10,20,30,40,50,60,70]}
    
df = pd.DataFrame(data)
df['PERIOD'] = pd.to_datetime(df['PERIOD'],format='%Y%m')
df.set_index('PERIOD', inplace=True)
total = df.groupby(pd.Grouper(freq='M')).sum()
print(total)

输出

            ACTUALS
PERIOD
2022-01-31      100
2022-02-28      110
2022-03-31       70

这是因为您正在比较两种不同类型的数据。在您的数据框中,列 'PERIOD' 是一个对象。但是您正在使用日期时间来过滤它。您需要在创建数据框之后将 'PERIOD' 列转换为日期时间列,而不是之前,之后也不要将其转换为字符串。这将起作用:

import pandas as pd
from datetime import datetime
data = {'PERIOD':['202201','202201','202201','202201','202202','202202','202203'], 'ACTUALS':[10,20,30,40,50,60,70]}
df = pd.DataFrame(data)
df['PERIOD'] = pd.to_datetime(df['PERIOD'], format='%Y%m', errors='coerce')
groupedResult = df.groupby('PERIOD', dropna=True)['ACTUALS'].sum().reset_index()