python-3.x - 熊猫在彼此附近更改日期
问题描述
我有一个带有日期和用户的熊猫数据框,看起来像这样-
date = ['1/2/2020','1/9/2020','1/10/2020','1/17/2020','1/18/2020','1/24/2020','1/25/2020','5/17/2019','5/18/2019','5/24/2019','5/29/2019']
user =['A','B','C','B','A','A','B','C','A','A','B']
df = pd.DataFrame(data={"Date":date, "User":user})
我正在尝试查找彼此相邻的所有日期(1 月 1 日和 1 月 2 日)并将它们转换为单个日期,这样两个条目就会成为两者中较低的一个。条目数量超过一百万。该数据是根据每晚触发的扫描结果创建的,有时会流入前一天。 更新 - 我想合并扫描日期,以便我可以正确显示可视化。就目前而言,扫描开始当天的结果将有更多条目,但扫描溢出当天的条目很少。存储了主要日期和时间,因此我不会丢失数据。用户列在扫描包含所有用户名的文件时显示,并且日期存储扫描的日期。
到目前为止,我能够读取数据框,然后根据日期对其进行排序,以使条目一个接一个。
输出应如下所示 -
有没有一种方法可以做到这一点?
解决方案
要考虑的一个问题是连续多天的情况以及您希望如何处理这些情况。以下代码将日期设置为每个块中连续天的第一天:
import pandas as pd
from datetime import timedelta
# prepend two dates to show multiple consecutive days "use-case"
date = ['12/31/2019','1/1/2020','1/2/2020','1/9/2020','1/10/2020','1/17/2020','1/18/2020','1/24/2020','1/25/2020','5/17/2019','5/18/2019','5/24/2019','5/29/2019']
user = ['Z','Z','A','B','C','B','A','A','B','C','A','A','B']
df = pd.DataFrame(data={"Date":date, "User":user})
# first convert to datetime to allow date operations
df.Date = pd.to_datetime(df.Date)
# check if the the date is one day after the row before (by shifting the Date column)
df['isConsecutive'] = (df.Date == df.Date.shift()+pd.DateOffset(1))
# get number of consecutive days in each block
df['numConsecutive'] = df.isConsecutive.groupby((~df.isConsecutive).cumsum()).cumsum()
# convert to timedelta
df.numConsecutive = df.numConsecutive.apply(lambda x: timedelta(days=x))
# take this as differnce to Date
df['NewDate'] = df.Date - df.numConsecutive
print(df)
这将返回:
Date User isConsecutive numConsecutive NewDate
0 2019-12-31 Z False 0 days 2019-12-31
1 2020-01-01 Z True 1 days 2019-12-31
2 2020-01-02 A True 2 days 2019-12-31
3 2020-01-09 B False 0 days 2020-01-09
4 2020-01-10 C True 1 days 2020-01-09
5 2020-01-17 B False 0 days 2020-01-17
6 2020-01-18 A True 1 days 2020-01-17
7 2020-01-24 A False 0 days 2020-01-24
8 2020-01-25 B True 1 days 2020-01-24
9 2019-05-17 C False 0 days 2019-05-17
10 2019-05-18 A True 1 days 2019-05-17
11 2019-05-24 A False 0 days 2019-05-24
12 2019-05-29 B False 0 days 2019-05-29
推荐阅读
- vba - 如何显示已实现目标的进度条?
- python - Python Pandas groupBy 条件
- radare2 - Radare2“块大小太大”
- mongodb - 如何在 $match 聚合中找到一组值并将结果分组?
- reactjs - Symfony ApiPlatform React - CORS
- ios - 如何使用 SQLite.swift 类型安全 API 链接条件?
- powershell - Powershell:已添加项目。字典中的键:'' 正在添加的键:'' 更新 AD 属性时
- c++ - 我应该让我的opencv校准程序设置我的相机固有K值,特别是Cx和Cy,还是手动设置?
- java - 为什么同一个程序在 Windows 和 Mac 上的运行方式不同
- java - 找不到 Spring 参考示例包 (org.springframework.samples)