python - 根据另一个熊猫的开始日期和结束日期列的条件创建新的熊猫数据框
问题描述
我在熊猫数据框中有开始日期时间和结束日期时间列,如下所示。
如果结束日期和时间更改为另一天或另一个小时,我需要创建一个新行,其中开始时间为下一小时的开始时间,结束时间为该小时的结束时间(如果原始结束时间 > 小时)或等于原始数据中的结束时间(如果原始结束时间 < 当前时间)并且很快。生成的预期表如下所示。
熊猫可以这样做吗,因为我的数据在数据框中
解决方案
计算和之间的小时差Start_Time
(End_Time
调用它),然后使用length
重复每一行。然后在开始日期创建的每个组中分别为行分配一个计数器。length
df.reindex(df.reindex.repeat(...))
0
length-1
然后对于Start_Time
,只要计数器不为零(即这不是该日期的起始行),将时间四舍五入hh:00:00
并按hour
计数器递增。
对于End_Time
,如果计数器不等于length-1
(即这不是该日期的最后一行),则设置End_Time
为Start_Time
但分钟和秒重置为 59,即格式hh:59:59
为:其中小时来自Start_Time
。
利用:
df = (pd.DataFrame({
'Start_Time': ['2019-08-29 17:29:29',
'2019-09-04 17:29:25', '2019-09-25 10:16:32'],
'End_Time': ['2019-08-29 17:32:18',
'2019-09-04 18:14:41', '2019-09-26 13:01:26']}))
df.Start_Time = pd.to_datetime(df.Start_Time)
df.End_Time = pd.to_datetime(df.End_Time)
timeDiff = df.End_Time.dt.floor(freq = 'H') - df.Start_Time.dt.floor(freq = 'H')
df['length'] = (timeDiff.dt.days * 24 + timeDiff.dt.seconds//3600 + 1)
df = df.reindex(df.index.repeat(df['length'])).reset_index(drop = True)
df['counter'] = (df.groupby(df.Start_Time.dt.date)['length']
.transform(lambda x: np.arange(x.iloc[0])))
mask = df.counter.eq(0)
(df.Start_Time.where(mask, df.Start_Time.dt.round('H') +
pd.to_timedelta(df.counter, unit = 'h'), inplace = True))
mask = df.length.eq(df.counter + 1)
masked_val = ((pd.to_timedelta(1, unit = 'h') +
df.Start_Time.dt.floor(freq = 'H'))
.dt.ceil(freq = 'H') + pd.to_timedelta(-1, unit = 'S'))
df.End_Time.where(mask, masked_val, inplace = True)
df.drop(columns = df.columns[2:], axis = 1, inplace = True)
输出:
>>> df
Start_Time End_Time
0 2019-08-29 17:29:29 2019-08-29 17:32:18
1 2019-09-04 17:29:25 2019-09-04 17:59:59
2 2019-09-04 18:00:00 2019-09-04 18:14:41
3 2019-09-25 10:16:32 2019-09-25 10:59:59
4 2019-09-25 11:00:00 2019-09-25 11:59:59
5 2019-09-25 12:00:00 2019-09-25 12:59:59
...
28 2019-09-26 11:00:00 2019-09-26 11:59:59
29 2019-09-26 12:00:00 2019-09-26 12:59:59
30 2019-09-26 13:00:00 2019-09-26 13:01:26
推荐阅读
- docker - 启动时在 Docker [CRITICAL] WORKER TIMEOUT 中运行 Gunicorn Flask 应用程序
- java - 将java后端连接到docker容器中的oracle db的问题
- sql - Power Query - 表名变量
- lisp - 在 Lisp 中验证棋盘上的移动和移动棋子
- c# - EF Core 2.1 Linq 查询到 EF Core 3.0
- jenkins - Jenkins Shell 脚本,将“/”替换为“_”,因替换错误而失败
- windows - 如何使用groovy在jenkins windows slave上执行CMD命令?
- zebra-printers - 使用 lpr 打印到远程打印机时,cups 忽略 -o raw 选项
- bash - 在 bash 中使用浮点数进行数学运算
- phpstorm - PhpStorm 2019.3 没有当前的内联参数名称提示彩色突出显示