一. datetime再了解
1.pd.to_datetime(df['date']).dt.date ==>得到的是含有精确到天的日期,格式为object而不是datetime
如上图为自测数据,可以看到dt.date格式为object但是只精确到天
类推:pd.to_datetime(df['date']).dt.month==>只得到date数据的月份,类型为int型
pd.to_datetime(df['date']).dt.year==>只得到date数据的年份,类型为int型
pd.to_datetime(df['date']).dt.day==>只得到date数据具体的几号(没有月和年),类型为int型
二.各种数量统计及其意义:count(),size(),sum()
1.count()
①字符串str.count('具体字符')可以得到字符串含有的字符数量
②列表中list.count(内容)可以得到内容在列表中含有的个数
③pandas应用
df.count()==>得到的是非空值的总个数(只有np.nan才是空值,空字符串也是会技数的哦!)
df = pd.DataFrame({'a':[1,np.nan,2]})
number = df['a'].count()
print(number)
代码结果:2 #np.nan为空值,count()不计入
④count_values()与count()
count_values()计算出不同值的个数分别是多少
如上图,value_counts()(正如它的中文解释)得到变量'A','B','C','D'的具体数量。
value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)
具体参数含义:
1.normalize : boolean, default False 默认false,如为true,则以百分比的形式显示
2.sort : boolean, default True 默认为true,会对结果进行排序
3.ascending : boolean, default False 默认降序排序
4.bins : integer, 格式(bins=1),意义不是执行计算,而是把它们分成半开放的数据集合,只适用于数字数据
5.dropna : boolean, default True 默认删除na
2.sum() ==>为求和。 df['data']==>若为数字则求出该列所有数字的和,若是字符串则合并字符串
三.日期差(timedelta)
pandas中to_timedelta的使用:
pd.to_timedelta(arg,unit=None,error='raise')
其中,arg为要转化成timedelta的数据,格式可以是:str,timedelta,Series;unit为单位,例如:'D'表示天;error可以是'ignore','raise','coerce'三种,如果为'raise'则无效解析将引发异常,如果为'ignore'则无效解析将输入返回。
实际使用:客户留存率问题(例子:客户在2022年11月连续登入超过n天(n<28)的客户信息)
个人思路:(方法类似sql取数)
①首先,将客户日期字段转化成到天的格式,通过判定筛选2022年12月的所有信息。
②将所有信息按照客户的唯一标识use_id分类,通过rank()函数进行排名,通过time_delta将日期和排名做差,如果差值一样说明为连续的天(这边需要将每个个体按天去重,防止同一天登录多算)。如下图,为某一用户的登录日期,验证上述说法正确。
| 2021-12-3 | 1 | 2 day |
| 2021-12-5 | 2 | 3 day |
| 2021-12-6 | 3 | 3 day |
| 2021-12-7 | 4 | 3 day |
③取用户分组后按日期差那列的value_counts()的最大值==>这个表示最大的连续登录时间,最后判断这个天数与n的关系得到结果。
(若想做连续登录天数的题,可以做牛客的python数据分析的第33题练手!)



