python - 如果开始日期优于结束日期,熊猫会更改日期格式
问题描述
我正在清理值是日期的数据,
有时我会找到开始日期优于结束日期的给定事件的值。
查看值后,我注意到这是由于数据收集期间日期时间格式错误造成的。
在某些行中,它是 yy-mm-dd,而其他行是 yy-dd-mm。
正确的格式应该是 yy-mm-dd。
这是数据
start_date end_date
0 2018-05-29 2018-04-06
7 2018-08-01 2018-03-30
5 2018-08-13 2018-06-09
3 2018-12-02 2018-02-15
11 2018-08-24 2018-05-09
12 2018-04-20 2018-02-05
1 2018-07-30 2018-03-08
8 2018-08-16 2018-03-09
10 2018-09-07 2018-07-20
基本上我想要检查每一行,如果 start_date 优于 end_date,则更改 end_date 或开始日期的格式,直到 end_date 优于开始日期。
例如:对于第一行:我需要将结束日期更改为 2018-06-04,但对于第二行,它的开始日期需要更改为 2018-01-08
有任何想法吗?
解决方案
好的,我不确定这是否有帮助,但让我们看看......
我想首先声明,IMO 试图修复在读入时损坏的数据可能是危险的——也许你假设它是如何被损坏的并不完全正确。
然而:
和
df.apply(lambda d: d.dt.day > 12)
Out:
start_date end_date
0 True False
7 False True
5 True False
3 False True
11 True False
12 True False
1 True False
8 True False
10 False True
我们可以看到,在所有行(我可以访问的行)中,无论是开始还是结束都有 >12 天,这显然不适合一个月。即,我们可以使用
mask = df.start_date.dt.day > 12
作为一个索引器,用于更改可能在开始侧与结束侧部分分开的部分,即日期值不大于 12 的部分:
df[~mask].start_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
Out:
7 2018-01-08
3 2018-02-12
10 2018-07-09
Name: start_date, dtype: datetime64[ns]
和
df[mask].end_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
Out:
0 2018-06-04
5 2018-09-06
11 2018-09-05
12 2018-05-02
1 2018-08-03
8 2018-09-03
Name: end_date, dtype: datetime64[ns]
所以如果应用:
df.start_date[~mask] = df[~mask].start_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
df.end_date[mask] = df[mask].end_date.apply(lambda d: pd.datetime(d.year, d.day, d.month))
这将导致
df
Out:
start_date end_date
0 2018-05-29 2018-06-04
7 2018-01-08 2018-03-30
5 2018-08-13 2018-09-06
3 2018-02-12 2018-02-15
11 2018-08-24 2018-09-05
12 2018-04-20 2018-05-02
1 2018-07-30 2018-08-03
8 2018-08-16 2018-09-03
10 2018-07-09 2018-07-20
它的开始不再晚于结束:
df.start_date > df.end_date
Out:
0 False
7 False
5 False
3 False
11 False
12 False
1 False
8 False
10 False
dtype: bool
推荐阅读
- kubernetes - Kubenetes 集群:所有 pod,磁盘部署下降
- c# - 为什么这段代码不起作用?跑步后什么都没有?我想在我看来有验证错误
- c# - 如何通过 C# 在 Excel 中查找列排序和顺序类型?
- swift - 如何在 View 方法中设置默认的 clouse 参数?
- c - 未检测到 ThreadSanitizer 死锁并且最后没有结果(由于死锁程序)
- python - ...\.cache\ 中的 FileNotFoundError 使用 SentenceTransformer
- excel - 测试 Excel 单元格是否为空
- r - 用 R 语言中的另一行替换特定行中的值
- mysql - 当解释知道答案时,为什么 count(*) 慢?
- apache-kafka - 在本地环境中使用 apache kafka 的事件数据流应用程序并将其移动到 AWS Kafka 以进行预生产/生产