gpt4 book ai didi

python - 在给定的时间段内按天计算

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:36 25 4
gpt4 key购买 nike

示例数据框:

    id           start1        end1      start2        end2
0 Bob 2018-11-29 2018-11-30 2018-12-01 2018-12-31
1 James 2018-10-19 2018-10-31 NaT NaT
2 Jane 2018-04-05 2018-07-12 2018-11-29 2018-11-30

鉴于上面的示例数据框,我想按月和年显示频率计数。让我们假设在这些时期每个人 (id) 都受到某种事物的“影响”。每个人最多有两个时间段(总是至少有一个时间段(即 start1end1),但可能有也可能没有第二个(即 start2end2))。我想显示在任何人受到影响的整个时间范围内有多少人受到月份和年份的影响。

例如,上面的数据会产生类似这样的结果(不确定年-月是同一列还是多列——随便吧):

   year-month  count
0 2018-04 1
1 2018-05 1
2 2018-06 1
3 2018-07 1
4 2018-08 0
5 2018-09 0
6 2018-10 1
7 2018-11 2
8 2018-12 1

我的最终目标是跨不同时间段(例如,年(在此示例数据中均为 2018 年)、月/年、周等)查看这些数据。

我不确定如何将它们分解成一个系列,以便我可以在单个列上绘制直方图。我知道一旦我将它们放在一个列中(例如,date)我就可以做类似的事情:

df.groupby(df["date"].dt.month).count().plot(kind="bar")

但这只会按月显示,而且它假设我已经在单列中包含了日期。

我可以只使用 datetime 并继续在循环中添加天数,如果它在每个时间范围之间直到我到达结束日期,但每次我做类似的事情时我都会了解到 pandas/numpy 有更好的方法。 我正在寻找更好的方法。

最佳答案

您可以先使用 pd.wide_to_long reshape 数据框

from pandas.tseries.offsets import MonthEnd

newdf=pd.wide_to_long(df,['start','end'],i='id',j='drop')
newdf=newdf.apply(pd.to_datetime)
newdf=newdf.dropna()
newdf.start=newdf.start.values.astype('datetime64[M]')
newdf.end=newdf.end+MonthEnd(0)
newdf
start end
id drop
Bob 1 2018-11-01 2018-11-30
James 1 2018-10-01 2018-10-31
Jane 1 2018-04-01 2018-07-31
Bob 2 2018-12-01 2018-12-31
Jane 2 2018-11-01 2018-11-30

然后我们使用date_range

l=[pd.date_range(x,y,freq='M',closed ='right').strftime('%Y-%m') for x ,y in zip(newdf.start,newdf.end)]
pd.Series(np.concatenate(l)).value_counts()
2018-11 2
2018-05 1
2018-12 1
2018-04 1
2018-06 1
2018-10 1
2018-07 1
dtype: int64

关于python - 在给定的时间段内按天计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53572082/

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