【问题标题】:return the days in a month that are not in a list返回一个月中不在列表中的天数
【发布时间】:2021-09-02 17:46:29
【问题描述】:

我有一个日期列表list = [1,5,16,29]

考虑当前月份september 和年份2021

我有一个用户明智的一天df

user_id    day     month   year
  1         1       9      2021 
  1         2       9      2021
  1         6       9      2021
  1        14       9      2021
  1        22       9      2021
  1        18       9      2021
  2         2       9      2021
  2        17       9      2021
  2         3       9      2021
  2        30       9      2021
  2        29       9      2021
  2        28       9      2021

如何获得给定月份和年份的用户明智天数,这些天数在各个用户 df['day']list 中不存在?

预期结果

user_id    remaining_days_of_month
   1          3,4,7,8,9,10,11,12,13,15,17,19,20,21,23,24,25,26,27,28,30
   2          4,6,7,8,9,10,11,12,13,14,15,18,19,20,21,22,23,24,25,26,27
 

【问题讨论】:

  • 我们也知道年份吗?如果是二月,不同年份的结果会有所不同
  • @AnanayMital 感谢您指出。是的,我们也知道年份。

标签: python pandas date datetime


【解决方案1】:

您可以使用calendar.monthrange 来获取一个年月的天数范围

df

import calendar

def get_remaining_days(group, lst):
    month = group.month.unique()[0]
    days_to_remove = np.unique(np.concatenate((group.day, lst)))
    lst_of_days = list(range(*calendar.monthrange(2021, month)))
    remaining_days = [i for i in lst_of_days if i not in days_to_remove]
    return remaining_days

lst = [1,5,16,29]

result = df.groupby(by=["user_id", "month"]).apply(lambda x: get_remaining_days(x, lst))
result.name = "remaining_days_of_month"
result = result.to_frame()
result

我让它适用于不同的月份和相同的用户。万一你也碰巧在不同的年份,它不需要太大的变化

【讨论】:

  • 为什么当我使用 df = pd.DataFrame({'user_id': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1}, 'day': {0: 16, 1: 17, 2: 18, 3: 19, 4: 20, 5: 21, 6: 23, 7: 24, 8: 25, 9: 26, 10: 27, 11: 28, 12:29, 13: 30, 14:31}, 'month': {0:8, 1:8, 2:8, 3:8, 4:8, 5:8, 6:8, 7:8, 8:8, 9:8, 10:8, 11:8, 12:8, 13:8, 14:8}}) 数据框时它没有给出正确的结果?
  • +继续lst = [1,8,15,22,29]
  • 我认为,lst_of_days 的含义应该给我们一整天的时间。但事实并非如此。它才回来几天。我不明白为什么会这样。
【解决方案2】:

使用calendar.monthrange 得到一个月的大小,然后做一个set 的差异

import pandas as pd
import calendar

df = pd.DataFrame({'user_id': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
                   'day': [1, 2, 6, 14, 22, 18, 2, 17, 3, 30, 29, 28],
                   'month': [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]})

month = df['month'].iloc[0]
values = [1, 5, 16, 29]
days_of_month = set(range(1, 1 + calendar.monthrange(2021, month)[1])).difference(values)

df: pd.DataFrame = df.groupby('user_id')['day'].apply(list).reset_index()
df['day'] = df['day'].apply(lambda cell: set(days_of_month).difference(cell))
user_id day
0 1 {3, 4, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28}
1 2 {4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27}

【讨论】:

  • 它还返回了列表中的日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
相关资源
最近更新 更多