gpt4 book ai didi

Python - 按月分组日期

转载 作者:太空狗 更新时间:2023-10-30 02:37:39 26 4
gpt4 key购买 nike

这是一个简单的问题,起初我认为它很简单。一个小时后,我不太确定!
所以,我有一个 Python datetime 对象列表,我想将它们绘制成图表。 x 值是年份和月份,y 值是这个列表中这个月发生的日期对象的数量。
也许一个例子可以更好地证明这一点 (dd/mm/yyyy):

[28/02/2018, 01/03/2018, 16/03/2018, 17/05/2018] 
-> ([02/2018, 03/2018, 04/2018, 05/2018], [1, 2, 0, 1])

我的第一次尝试是简单地按日期和年份分组,大致如下:

import itertools
group = itertools.groupby(dates, lambda date: date.strftime("%b/%Y"))
graph = zip(*[(k, len(list(v)) for k, v in group]) # format the data for graphing

您可能已经注意到,这将仅按列表中已存在的日期进行分组。在我上面的例子中,没有一个日期发生在四月这一事实将被忽略。

接下来,我尝试找到开始和结束日期,并在它们之间循环:

import datetime
data = [[], [],]
for year in range(min_date.year, max_date.year):
for month in range(min_date.month, max_date.month):
k = datetime.datetime(year=year, month=month, day=1).strftime("%b/%Y")
v = sum([1 for date in dates if date.strftime("%b/%Y") == k])
data[0].append(k)
data[1].append(v)

当然,这仅在 min_date.month 小于 max_date.month 时有效,如果它们跨越多年则不一定如此。而且,它非常丑陋。

有没有一种优雅的方式来做到这一点?
提前致谢

编辑:明确地说,日期是datetime 对象,而不是字符串。为了便于阅读,它们在这里看起来像字符串。

最佳答案

我建议使用 pandas :

import pandas as pd

dates = ['28/02/2018', '01/03/2018', '16/03/2018', '17/05/2018']

s = pd.to_datetime(pd.Series(dates), format='%d/%m/%Y')
s.index = s.dt.to_period('m')
s = s.groupby(level=0).size()

s = s.reindex(pd.period_range(s.index.min(), s.index.max(), freq='m'), fill_value=0)
print (s)
2018-02 1
2018-03 2
2018-04 0
2018-05 1
Freq: M, dtype: int64

s.plot.bar()

graph

解释:

  1. 首先创建Seriesdate 列表中转换 to_datetime s.
  2. 通过 Series.dt.to_period 创建 PeriodIndex
  3. groupby按索引 (level=0) 并按 GroupBy.size 获取计数
  4. 通过 Series.reindex 添加缺失的句点通过 PeriodIndex由索引的最大值和最小值创建
  5. 最后一个情节,例如酒吧 - Series.plot.bar

关于Python - 按月分组日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49584924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com