pandas 关于日期排序部分操作小记

项目场景:

对于商超每日都会有很多收支流水,对于一些分店和总店一些导出流水格式不一。最后要将这些流水汇总后一起核对


问题描述

以下是对于Excel表单中日期顺序的可能性

  1. 对于一张Excel表中多日期(年月日 时分秒)按照正常时间正序或者倒序
  2. 对于一张Excel表中单一某一天(年月日 时分秒)按照正常时间正序或者倒序
  3. 对于一张Excel表中多日期(年月日 时分秒)按照日期月份是指定顺序,按照日期是指定顺序
  4. 对于一张Excel表中多日期(年月日 时分秒) 按照日期月份是乱序,按照日期是指定顺序
  5. 对于一张Excel表中多日期(年月日) 按照正常时间正序或者倒序
  6. 对于一张Excel表中单一某一天(年月日)按照正常时间正序或者倒序
  7. 对于一张Excel表中多日期(年月日)按照日期月份是指定顺序,按照日期是指定顺序
  8. 对于一张Excel表中多日期(年月日)按照日期月份是乱序,按照日期是指定顺序

原因分析:

对于Excel表格,尤其是日期中不含时分秒的情况,经常使用排序时会出现同一日期数据顺序错乱的情况

原数据表                              错误排序后效果                    正确排序后效果        

错误排序和正确排序区别在于2024-01-01 00:00:00 对应的0101-1,0101-2,0101-3 的先后顺序。途中除源数据表,其余均为降序排列


解决方案:

data = {“A”:"", "B":""}

df = pd.DataFrame(data)

# ascending=False 是降序

# ascending=True 是升序

# 1.对于一张Excel表中多日期(年月日 时分秒)按照正常时间正序或者倒序
# 2.对于一张Excel表中单一某一天(年月日 时分秒)按照正常时间正序或者倒序
# 注意这种方式不可以出现时分秒为00:00:00情况
df.sort_values(by="A", inplace=True, ascending=False)
# 3.对于一张Excel表中多日期(年月日 时分秒)按照日期月份是指定顺序,按照日期是指定顺序
# 4.对于一张Excel表中多日期(年月日 时分秒) 按照日期月份是乱序,按照日期是指定顺序
# 7.对于一张Excel表中多日期(年月日)按照日期月份是指定顺序,按照日期是指定顺序
# 8.对于一张Excel表中多日期(年月日)按照日期月份是乱序,按照日期是指定顺序
# todo 新增Month列,并进行分组
pd_deal['A_format'] = pd.to_datetime(pd_deal['A_format'])
pd_deal['Month'] = pd.to_datetime(pd_deal['A_format']).dt.strftime("%Y-%m")
# todo 遍历每一个月份,得到该月的日期
for name, group in pd_deal.groupby('Month'):
    # todo 得到月内去重后的日期,这一步很重要,pandas判断单调性的方法对于重复数据会判断失误,因此需要进行去重
    dates_only = group['A_format'].dt.strftime("%Y-%m-%d").drop_duplicates()
    df1 = pd_deal[pd_deal["Month"].isin([name])]
    # todo 由于乱序或者日期非统一单调性因此,将月内全部日期按照索引删掉
    index1 = df1.index.values.tolist()
    pd_deal.drop(index=index1, inplace=True)
    # todo 判断单调性 这种情况是某月内容只有一个日期
    if dates_only.is_monotonic_decreasing and dates_only.is_monotonic_increasing:
         df1['A_sfm'] = pd.to_datetime(df1['A']).dt.strftime("%H:%M:%S")
         # todo 筛出并去掉时分秒为00:00:00
         df2 = df1[~df1["A_sfm"].isin(["00:00:00"])]
         # todo 将时分秒去重
         only_day_data = df2['A_sfm'].drop_duplicates()
         # todo 判断单调性(降序)
         if only_day_data.is_monotonic_decreasing:
              # todo 顺序翻转
              df1 = df1.iloc[::-1]
              df1.drop(["A_sfm"], axis=1, inplace=True)
    # todo 判断单调性
    elif dates_only.is_monotonic_decreasing:
         df1 = df1.iloc[::-1]
         pd_deal = pd_deal._append(df1)
# todo 索引重新排序
pd_deal.reset_index(inplace=True)
pd_deal.drop(["Month", "A_format", "index"], axis=1, inplace=True)
# 5.对于一张Excel表中多日期(年月日) 按照正常时间正序或者倒序
# 6.对于一张Excel表中单一某一天(年月日)按照正常时间正序或者倒序
df= df.iloc[::-1]  # -1 是翻转,属于倒序,正常就是默认顺序

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值