dataframe取 时间在30日内的记录

数据:

df = pd.DataFrame({'date':['客户在2016年6月12日交货',
                           '客户在2019年12月25日交货',
                           '客户在2020年1月19日交货',
                           '客户在2020年2月11日交货',
                           '客户在2020年2月16日交货'],
                           'money':[1.56, 2.04, 3.45, 10.10, 5.62]})

显示:


图1.png

第一步:把 date 字段中的年月日信息 通过正则 取出来,并存成新字段 交货时间,但 交货时间 字段是list的格式

df['交货时间'] = df['date'].str.findall(r"(\d{4}年\d{1,2}月\d{1,2}日)")

显示:


图2.png

第二步:把 交货时间 字段中的年月日 替换成英文格式的 '-' ,方便后面把时间转换后进行比较

def latestTime(dDate):
    data01 = dDate['交货时间']
    dataList = []
    for f017v_data in data01:
        f017v_data = f017v_data.replace('年', '-')
        f017v_data = f017v_data.replace('月', '-')
        f017v_data = f017v_data.replace('日', '-')
        f017v_data = pd.to_datetime(f017v_data)
        f017v_data = str(f017v_data)[0:10]
        dataList.append(f017v_data)
        dataList = dataList[0]
    return dataList

df['交货时间'] = df.apply(latestTime, axis = 1)

显示:


图3.png

第三步:把 交货日期 在距离今天 30日 内的数据 通过新建字段 bool中标记为1,最后只取 bool 字段为1的记录即可,这样 就会在这30天内每天都进行交货相关信息的提醒。

注:今天是 2020年1月15日

today = pd.datetime.now()

def dfApply(d):
    d = datetime.datetime.strptime(d, '%Y-%m-%d')
    theDay = today + dateutil.relativedelta(days = 30)
    if d <= theDay and d >= today:
        return 1
    else:
        return 0 

df['bool'] = df['交货时间'].apply(dfApply)
df = df[df['bool'].isin([1])]  # 只取bool值为1 的记录
df.drop(df[['bool', '交货时间']], axis = 1, inplace = True)  # 删除字段 bool 和 交货时间
df.to_csv('df.csv', encoding = 'utf-8-sig', index = None)  # 保存为csv格式,且不存 行号

显示:


图4.png

你可能感兴趣的:(dataframe取 时间在30日内的记录)