按年份过滤特定列
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()
我有要分组的数据,之后我想按当年过滤它。
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()