- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个数据框。其中包含时间戳和项目的一种。另一个有日期范围、项目和期限,必须映射到日期范围内的相应项目。
我的问题是similar to this question ,但是提供的答案非常慢,并且我有一个额外的条件需要满足。对于初学者来说,我的两个数据框看起来像这样:
In:
import pandas as pd
df_a = pd.DataFrame({'time': ('06.05.2015 16:15:16', '22.06.2015 08:52:05', '28.05.2015 18:20:21','28.06.2015 16:19:21'),
'project': ('project1', 'project2', 'project2', 'project1')})
df_b = pd.DataFrame({'start-date': ('02.05.2015 00:00:00', '26.06.2015 00:00:00', '16.05.2015 00:00:00', '30.05.2015 00:00:00'),
'end-date':('24.06.2015 00:00:00', '27.07.2015 00:00:00', '27.05.2015 00:00:00', '27.06.2015 00:00:00'),
'project': ('project1','project1','project2','project2'),
'maturity': ('one','two', 'one','two')})
我的代码如下所示:
for i in df_a.project.unique():
for j in df_b.project.unique():
if i == j:
for index_df_a, row_df_a in df_a.iterrows():
for index_df_b, row_df_b in df_b.iterrows():
if (row_df_a['time'] >= row_df_b['start-date']) & (row_df_a['time'] <= row_df_b['end-date']):
df_a.loc[index_df_a, 'maturity'] = row_df_b.loc['maturity']
break
Out:
time project maturity
0 06.05.2015 16:15:16 project1 one
1 22.06.2015 08:52:05 project2 one
2 28.05.2015 18:20:21 project2 NaN
3 28.06.2015 16:19:21 project1 NaN
预期结果:
time project maturity
0 06.05.2015 16:15:16 project1 one
1 22.06.2015 08:52:05 project2 one
2 28.05.2015 18:20:21 project2 two
3 28.06.2015 16:19:21 project1 two
if i==j:
语句是错误的。从结果第 4 行可以看出:即使项目映射到 project1
并且时间戳 28.06.2015 16:19:21
在 范围内开始:26.06.2015 00:00:00 | end: 27.07.2015 00:00:00
成熟度为 NaN
而不是 two
。28.05.2015 18:20:21
不在任何日期范围内,则下一个日期范围提供到期日。在本例中两个
。请原谅我一次问得太多。我知道最好的做法是通过提出简单的问题并逐步获得结果来得出答案,但是我的经验还不够,无法将问题分成更小的部分。
最佳答案
pd.date_range
与 start-date
和 end-date
结合使用,将 d_range
列添加到 df_b
,则可以使用.isin
从d_range
内的df_a
查找时间
d_range
将是开始和结束之间的日期列表。time
格式不正确,它将与 d_range
内的日期不匹配。d_time
中将找不到 time
。import pandas as pd
# create dataframes from your test set and clean-up the datetime columns
df_a['time'] = (pd.to_datetime(df_a['time'], format='%d.%m.%Y %H:%M:%S')).dt.date
df_b['start-date'] = pd.to_datetime(df_b['start-date'], format='%d.%m.%Y %H:%M:%S').dt.date
df_b['end-date'] = pd.to_datetime(df_b['end-date'], format='%d.%m.%Y %H:%M:%S').dt.date
# df_a view
time project
2015-05-06 project1
2015-06-22 project2
2015-05-28 project2
2015-06-28 project1
# df_b view
start-date end-date project maturity
2015-05-02 2015-06-24 project1 one
2015-06-26 2015-07-27 project1 two
2015-05-16 2015-05-27 project2 one
2015-05-30 2015-06-27 project2 two
# add d_range to df_b
df_b['d_range'] = df_b[['start-date', 'end-date']].apply(lambda x: pd.date_range(x[0], x[1]), axis=1)
成熟度
添加到 df_a
mask
是从 df_a
中搜索 df_b
日期的结果
mask
与任何项目的日期匹配仅返回
匹配项目的结果def date_query(x):
mask = df_b[['project', 'maturity']][df_b['d_range'].apply(lambda y: y.isin([x[0]]).any())].reset_index(drop=True)
result = mask['maturity'][mask['project'] == x[1]].reset_index(drop=True)
return result
# call function
df_a['maturity'] = df_a.apply(lambda x: date_query(x), axis=1)
# df_a updated
time project maturity
2015-05-06 project1 one
2015-06-22 project2 two
2015-05-28 project2 NaN
2015-06-28 project1 two
result
from def date_query
是一个 pandas.Series
,如果没有匹配的日期范围,则为空,可以是使用 .empty
def date_query
以检查 result
是否为空。如果 result
为空,则调用 def check_min_timedelta
。.idxmin
将返回第一个出现的def check_min_timedelta(x):
"""
Create a timedelta between time and end-date
Return maturity for the row with the minimum time date
"""
end_diff = abs(df_b['end-date'][df_b['project'] == x[1]] - x[0]).idxmin()
return df_b['maturity'].loc[end_diff]
# update def date_query
def date_query(x):
mask = df_b[['project', 'maturity']][df_b['d_range'].apply(lambda y: y.isin([x[0]]).any())].reset_index(drop=True)
result = mask['maturity'][mask['project'] == x[1]].reset_index(drop=True)
if result.empty:
result = check_min_timedelta(x)
return result
# call function
df_a['maturity'] = df_a.apply(lambda x: date_query(x), axis=1)
# final df_a:
time project maturity
2015-05-06 project1 one
2015-06-22 project2 two
2015-05-28 project2 one
2015-06-28 project1 two
时间
与开始日期
和结束日期
进行比较的原始方法def date_query(x):
已更新,.dt.date
已删除。df_a['time'] = pd.to_datetime(df_a['time'], format='%d.%m.%Y %H:%M:%S')
df_b['start-date'] = pd.to_datetime(df_b['start-date'], format='%d.%m.%Y %H:%M:%S')
df_b['end-date'] = pd.to_datetime(df_b['end-date'], format='%d.%m.%Y %H:%M:%S')
def check_min_timedelta(x):
"""
Create a timedelta between time and end-date
Return maturity for the row with the minimum time date
"""
end_diff = abs(df_b['end-date'][df_b['project'] == x[1]] - x[0]).idxmin()
return df_b['maturity'].loc[end_diff]
# update def date_query
def date_query(x):
mask = df_b[['project', 'maturity']][df_b[['start-date', 'end-date']].apply(lambda y: ((x[0] >= y[0]) & (x[0] <= y[1])), axis=1)].reset_index(drop=True)
result = mask['maturity'][mask['project'] == x[1]].reset_index(drop=True)
if result.empty:
result = check_min_timedelta(x)
return result
# call function
df_a['maturity'] = df_a.apply(lambda x: date_query(x), axis=1)
关于python - 如果日期在另一个数据帧的日期范围内且项目相等,则在一个数据帧中分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58698491/
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!