Python 你能从熊猫的日期中同时提取年和月吗

Python 你能从熊猫的日期中同时提取年和月吗,python,pandas,dataframe,plot,Python,Pandas,Dataframe,Plot,我有一个带有日期列的数据框(键入datetime)。我可以很容易地提取年份或月份来进行分组,但是我找不到一种方法可以同时从日期中提取年份和月份。我需要分析一个产品在一年内的表现,并绘制一张图表,显示它每个月的表现。当然,我不能只按月份分组,因为它会为两个不同的年份添加相同的月份,而按年份分组不会产生我想要的结果,因为我需要每月查看绩效 我一直在寻找几种解决方案,但迄今为止没有一种有效 基本上,我现在的约会是这样的 2018-07-20 2018-08-20 2018-08-21 2018-10-

我有一个带有日期列的数据框(键入datetime)。我可以很容易地提取年份或月份来进行分组,但是我找不到一种方法可以同时从日期中提取年份和月份。我需要分析一个产品在一年内的表现,并绘制一张图表,显示它每个月的表现。当然,我不能只按月份分组,因为它会为两个不同的年份添加相同的月份,而按年份分组不会产生我想要的结果,因为我需要每月查看绩效

我一直在寻找几种解决方案,但迄今为止没有一种有效

基本上,我现在的约会是这样的

2018-07-20
2018-08-20
2018-08-21
2018-10-11
2019-07-20
2019-08-21

我只想拥有2018-07、2018-08、2018-10等等。

一种方法是将列转换为所有这些日期的月初,然后按月创建分析:

date_col = pd.to_datetime(['2011-09-30', '2012-02-28'])
new_col = date_col + pd.offsets.MonthBegin(1)

在这里,您的分析保持不变,每月进行一次。有两个选项,一个是映射到每月的第一个:

假设您的日期位于名为“日期”的列中,类似于:

df['ym-date'] = df['date'].dt.strftime('%Y-%m')
df['Date\u no\u day']=df['Date'].应用(lambda x:x.replace(day=1))

如果您真的只想存储年份和月份,可以映射到
(年、月)
元组,例如:

df['Date\u no\u day']=df['Date'].应用(λx:(x.year,x.month))


从这里,您可以按此新列进行分组/聚合并执行分析

如果它们存储为datetime,您应该能够使用datetime.strftime()创建一个只包含要分组的年份和月份的字符串

它看起来像:

df['ym-date'] = df['date'].dt.strftime('%Y-%m')

您可以使用
来设置时段

df['month\u year']=df['date'].dt.至_期间('M'))

如果您有一些使用日期时间值的数据,如下所示:

sale_date = [
    pd.date_range('2017', freq='W', periods=121).to_series().reset_index(drop=True).rename('Sale Date'),
    pd.Series(np.random.normal(1000, 100, 121)).rename('Quantity')
]
sales = pd.concat(data, axis='columns')
d = sales['Sale Date']
sales.groupby([d.dt.year.rename('Year'), d.dt.month.rename('Month')]).sum()

您可以按年份和日期同时分组,如下所示:

sale_date = [
    pd.date_range('2017', freq='W', periods=121).to_series().reset_index(drop=True).rename('Sale Date'),
    pd.Series(np.random.normal(1000, 100, 121)).rename('Quantity')
]
sales = pd.concat(data, axis='columns')
d = sales['Sale Date']
sales.groupby([d.dt.year.rename('Year'), d.dt.month.rename('Month')]).sum()

您还可以创建一个字符串,表示月份和年份的组合,并按以下方式分组:

ym_id = d.apply("{:%Y-%m}".format).rename('Sale Month')
sales.groupby(ym_id).sum()

日期是索引吗?请检查此代码段将不起作用,它将抛出一个AttributeError,您需要执行:
df['ym-date']=df['date'].dt.strftime(“%Y-%m”)
但是,这不会给我一个分组,将重复月份的结果合并为一个吗?我的分析从2018年7月到2019年9月,在此之后,您将执行您的团队。您需要指定合并为一个的含义。平均数/总和/计数等@Dasphillipbrau这是推荐的,适合您的需要。