我有一个带有日期列的数据框(类型为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
,依此类推。
答案 0 :(得分:6)
您可以使用to_period
df['month_year'] = df['date'].dt.to_period('M')
答案 1 :(得分:1)
如果将它们存储为datetime,则应该可以使用datetime.strftime(https://strftime.org/)创建仅包含年份和月份进行分组的字符串。
它看起来像:
df['ym-date'] = df['date'].dt.strftime('%Y-%m')
答案 2 :(得分:0)
一种方法可能是将列转换为所有这些日期的第一个月,然后逐月创建分析:
date_col = pd.to_datetime(['2011-09-30', '2012-02-28'])
new_col = date_col + pd.offsets.MonthBegin(1)
您的分析在这里保持每月不变
答案 3 :(得分:0)
有两个选项,一个是映射到每月的第一天:
假设您的日期位于“日期”列中,例如:
df['Date_no_day'] = df['Date'].apply(lambda x: x.replace(day=1))
如果您真的只想存储年和月,则可以映射到(year, month)
元组,例如:
df['Date_no_day'] = df['Date'].apply(lambda x: (x.year, x.month))
在这里,您可以按此新列分组/汇总并执行分析
答案 4 :(得分:0)
如果您有一些使用日期时间值的数据,例如:
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()