目录
- 一、数据源要求
- 二、逻辑思路
- 1、ROI区域
- 2、对ROI区域进行判定
- 三、代码实现
- 四、成果展示
- 总结
碰到一个非常有趣的问题:
在我们的日常工作中,常常需要处理各种各样的数据,其中不乏包含日期和时间信息的数据。 有时候我们会发现这些数据中日期和时间之间没有空格,比如"2023/3/412:20:9"; 这样的数据让人感觉很别扭,还不利用后续数据的统计。那么,我们该怎么处理这个问题呢?
一、数据源要求
有什么菜才能做什么饭。要先分析原材料成分,我现在拿到的数据格式是如下:
- 从上到下日期时间是递增的;
- 时间格式是:0:00:00类型的;
二、逻辑思路
1、ROI区域
年月日中的日与时分秒中的时之间;YYYY/MM/DD HH
:mm:ss(红色区域)
2、对ROI区域进行判定
依出现的字符个数进行判定:
- 若ROI区域包含空格,则不进行处理,比如:“4 4”、“12 3”;
- 有4个和有2个个字符的,只能是日和时各占一半,比如:“1313”、“12”;
- 有三个字符的,比较复杂:
3.1. 前两个字符必须小于32,后两个字符必须时小于24,比如:“414”、“152”;
3.2. 对于三个字符中间存在0,则把前两个按照日来算,比如:“102”、“203”;
3.3 对其他的三个字符无法判定的,我们需要引入一个全局变量sign,来存储最近的一个正确格式的日期,无法判定的日期就可以根据全局变量sign的日的位数,进行判定;
三、代码实现
import pandas as pd
import re,os
# 导入文件
df = pd.read_excel(r'/Users/chaizhiying/Downloads/处理日期时间空格缺失问题.xlsx',sheet_name=0)
df = df[df['日期'].notna()]
dat = [item.replace('/','-').replace(':',':') for item in df['日期'].astype('str').tolist()]
# 主要的处理逻辑函数
sign = ''
def Return_rule(wait_task):
global sign
if ' ' in wait_task:
handle_wait_task = wait_task
elif len(wait_task) == 2 or len(wait_task) == 4:
handle_wait_task = str(int(wait_task[:len(wait_task)//2])) + ' ' + wait_task[len(wait_task)//2:]
elif len(wait_task) == 3:
if int(wait_task[:2]) > 31:
handle_wait_task = wait_task[:1] + ' ' + wait_task[1:]
elif int(wait_task[1:]) > 24:
handle_wait_task = wait_task[:2] + ' ' + wait_task[2:]
else:
if wait_task[1] == '0':
handle_wait_task = wait_task[:2] + ' ' + wait_task[2:]
else:
le = len(sign.split(' ')[0])
handle_wait_task = wait_task[:le] + ' ' + wait_task[le:]
sign = handle_wait_task
return handle_wait_task
ls = []
for i in dat:
wait_tas = re.findall(r'-.*-(.*?):',i,re.S)[0]
handle_wait_task = Return_rule(wait_tas)
result = i.split(wait_tas)[0] + handle_wait_task + i.split(wait_tas)[1]
ls.append(result)
df['日期_处理后'] = ls
df.to_excel(r'/Users/chaizhiying/Downloads/处理日期时间空格缺失问题_c.xlsx')
四、成果展示
总结
通过这样的处理,我们可以让日期和时间更加直观和易读。如果你对这个问题感兴趣,不妨尝试一下吧!当然我处理后的日期格式统一格式;
以上是一个简单的例子,希望它能够给您提供一些灵感。当然,如果有什么Bug或者改进的地方,欢迎留言评论!