【问题标题】:Finding the streak of days in python在 python 中找到连续的日子
【发布时间】:2018-11-11 06:03:03
【问题描述】:

所以我有一组 50 个日期,例如我在这里指定了 7 个

df["CreatedDate"] = pd.DataFrame('09-08-16 0:00','22-08-16 0:00','23-08-16 0:00',28-08-16 0:00,'29-08-16 0:00','30-08-16 0:00','31-08-16 0:00')
df["CreatedDate"] = pd.to_datetime(df4.CreatedDate)
df4["DAY"] = df4.CreatedDate.dt.day

如何找到形成连续区间 [1-3],[4-7],[8-15],[>=16] 的连续天数

 Streak Count 
 1-3     3    #(9),(22,23) are in range [1-3]
 4-7     1    #(28,29,30,31) are in range [4-7]
 8-15    0
 >=16    0

假设产品(笔)已在 2 年前推出,我们将获取从今天起过去 10 个月的数据集,我想发现的是,如果人们连续 1 或 2 或 3 年购买该笔天,如果是,则将计数放置 [1-3],如果他们连续购买 4 或 5 或 6 或 7 天,我们将计数放置在 [4-7] 中,以此类推其他范围

我不知道要指定哪个条件来匹配条件

【问题讨论】:

  • 这与您的其他 question 有什么不同,后者已经有一个很好的答案可以做到这一点?
  • 我还没有得到答案。
  • 您想要自最早时间戳以来的天数吗?另一个问题也不是很清楚。我的意思是,您想从产品销售的第一天起将您的数据分组?我不明白9,22,23是怎么在同一个组里的
  • 不,我们只是说产品(笔)已在 2 年前推出,我们从今天开始获取过去 10 个月的数据集,我想发现的是,如果人们持续购买那支笔1 天或 2 天或 3 天,如果是,则放置计数 [1-3],如果他们连续购买 4 或 5 或 6 或 7 天,我们将计数放入 [4-7] 等其他范围
  • 在 9(仅 1 天)内销售产品,9 天后没有连续天数,并且连续 1 天在 [1-3] 范围内。在 22 和 23 中,产品正在销售(连续 2 天),这也在 [1-3] 范围内

标签: python python-3.x pandas group-by pivot-table


【解决方案1】:

我认为需要:

df4 = pd.DataFrame({'CreatedDate':['09-08-16 0:00','22-08-16 0:00','23-08-16 0:00','28-08-16 0:00','29-08-16 0:00','30-08-16 0:00','31-08-16 0:00']})
df4["CreatedDate"] = pd.to_datetime(df4.CreatedDate)

df4 = df4.sort_values("CreatedDate")
count = df4.groupby((df4["CreatedDate"].diff().dt.days > 1).cumsum()).size()
print (count)
CreatedDate
0    2
1    4
2    1
dtype: int64

a = (pd.cut(count, bins=[0,3,7,15,31], labels=['1-3', '4-7','8-15', '>=16'])
       .value_counts()
       .sort_index()
       .rename_axis('Streak')
       .reset_index(name='Count'))
print (a)
  Streak  Count
0    1-3      2
1    4-7      1
2   8-15      0
3   >=16      0

【讨论】:

【解决方案2】:

这是一个尝试,分箱与@jezrael 相同(除了我不确定的最后一个箱应该限制为31...有没有办法与pd.cut 建立开放间隔?)

import pandas as pd

df = pd.DataFrame({ "CreatedDate": ['09-08-16 0:00','22-08-16 0:00','23-08-16 0:00','28-08-16 0:00','29-08-16 0:00','30-08-16 0:00','31-08-16 0:00']})
df["CreatedDate"] = pd.to_datetime(df.CreatedDate)

# sort by date
df = df.sort_values("CreatedDate")

# group consecutive dates
oneday = pd.Timedelta("1 day")
df["groups"] = (df.diff() > oneday).cumsum()
counts = df.groupby("groups").count()["CreatedDate"]

# bin
streaks = (pd.cut(counts, bins=[0,3,7,15,1000000], labels=['1-3', '4-7','8-15', '>=16'])
           .value_counts()
           .rename_axis("streak")
           .reset_index(name="count"))

print(streaks)

  streak  count
0    1-3      2
1    4-7      1
2   >=16      0
3   8-15      0

【讨论】:

  • 出现错误:-: 'str' 和 'str' 的操作数类型不受支持
  • 您是否将日期转换为日期时间?
  • 是的,我确实隐蔽了它
  • 包含了完整的代码,这是否也失败了,还是在你的完整数据集中失败了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多