- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下df
,
cluster_id amount inv_id inv_date
1 309.9 07121830990 2018-07-12
1 309.9 07121830990 2018-07-12
2 3130.0 20180501313000B 2018-05-01
2 3130.0 20180501313000B 2018-05-01
3 3330.50 201804253330.50 2018-04-25
3 3330.50 201804253330.50 2018-04-25
4 70.0 61518 2018-06-15
4 70.0 61518 2018-06-15
5 100.0 011318 2018-01-13
5 100.0 011318 2018-01-13
6 50.0 12202017 2017-12-20
6 50.0 12202017 2017-12-20
7 101.0 0000014482 2017-10-01
7 101.0 0000014482 2017-10-01
我想通过 groupby
cluster_id
创建一个 bool 列 dummy_inv_id
,并将 dummy_invoice_id
设置为 如果对于每个组,则为 True
,
1. inv_id (stripped non-numerics) ends with amount and the remaining part of inv_id can be coerced into a valid date which is +/- 180 days of the inv_date
或
2. inv_id (stripped non-numerics) can be coerced into a date which is +/- 180 days of the inv_date
首先,我将从 inv_id
和 groupby
cluster_id
中删除所有非数字字符
df['inv_id_stp'] = df.inv_id.str.replace(r'\D+', '')
grouped = df.groupby('cluster_id')
然后将amount
* 100转为字符串,方便匹配
df['amount'] = df['amount']*100
df['amt_str'] = df['amount'].apply(str)
例如309.9
到 '30990'
,3130.0
到 '313000'
,这里我想知道如何检查 inv_id
这里以 amount
结尾,然后如何检查 inv_id
的剩余部分是否可以转换为 datetime
并在inv_date
的+/-180 天,或者inv_id
可以直接转换为日期。特别是有一些日期格式,即
071218 - 2018-07-12
20180501 - 2018-05-01
61518 - 2018-06-15
12202017 - 2017-12-20
0000014482 - cannot be converted to date
结果df
看起来像,
cluster_id amount inv_id inv_date dummy_inv_id
1 309.9 07121830990 2018-07-12 True
1 309.9 07121830990 2018-07-12 True
2 3130.0 20180501313000B 2018-05-01 True
2 3130.0 20180501313000B 2018-05-01 True
3 3330.50 201804253330.50 2018-04-25 True
3 3330.50 201804253330.50 2018-04-25 True
4 70.0 61518 2018-06-15 True
4 70.0 61518 2018-06-15 True
5 100.0 011318 2018-01-13 True
5 100.0 011318 2018-01-13 True
6 50.0 12202017 2017-12-20 True
6 50.0 12202017 2017-12-20 True
7 101.0 0000014482 2017-10-01 False
7 101.0 0000014482 2017-10-01 False
最佳答案
想法是创建辅助字典,其中包含可能的日期时间格式以及用于切片和列表理解转换的字母数量 - errors='coerce'
为不匹配创建 NaT
值:
from functools import reduce
#add zeros to length 6
s = df.inv_id.str.replace(r'\D+', '').str.zfill(6)
formats = {'%m%d%y':6,
'%y%m%d':6,
'%Y%m%d':8,
'%m%d%Y':8}
L = [pd.to_datetime(s.str[:v], format=k, errors='coerce') for k,v in formats.items()]
但某些格式应该转换不好,因此这些超出范围的日期时间会转换为 NaT
:
L = [x.where(x.between('2000-01-01', pd.datetime.now())) for x in L]
并将所有非 NaT 值组合在一起 Series.combine_first
:
s2 = reduce(lambda l,r: pd.Series.combine_first(l,r), L)
print (s2)
0 2018-07-12
1 2018-07-12
2 2018-05-01
3 2018-05-01
4 2018-04-25
5 2018-04-25
6 2018-06-15
7 2018-06-15
8 2018-01-13
9 2018-01-13
10 2017-12-20
11 2017-12-20
12 NaT
13 NaT
Name: inv_id, dtype: datetime64[ns]
最后一次检查+-180
天:
df['new'] = s2.between(s2 - pd.Timedelta(180, unit='d'), s2 + pd.Timedelta(180, unit='d'))
<小时/>
print (df)
cluster_id amount inv_id inv_date new
0 1 309.9 07121830990 2018-07-12 True
1 1 309.9 07121830990 2018-07-12 True
2 2 3130.0 20180501313000B 2018-05-01 True
3 2 3130.0 20180501313000B 2018-05-01 True
4 3 3330.5 201804253330.50 2018-04-25 True
5 3 3330.5 201804253330.50 2018-04-25 True
6 4 70.0 61518 2018-06-15 True
7 4 70.0 61518 2018-06-15 True
8 5 100.0 011318 2018-01-13 True
9 5 100.0 011318 2018-01-13 True
10 6 50.0 12202017 2017-12-20 True
11 6 50.0 12202017 2017-12-20 True
12 7 101.0 0000014482 2017-10-01 False
13 7 101.0 0000014482 2017-10-01 False
编辑:
添加了从末尾删除子字符串的解决方案:
import re
from functools import reduce
df['amt_str'] = (df['amount']*100).round().astype(int).astype(str)
df['inv_str'] = df.inv_id.str.replace(r'\D+', '').str.zfill(6)
#https://stackoverflow.com/a/1038845/2901002
df['inv_str'] = df.apply(lambda x: re.sub('{}$'.format(x['amt_str']),'', x['inv_str']),axis=1)
print (df)
cluster_id amount inv_id inv_date amt_str inv_str
0 1 309.9 07121830990 2018-07-12 30990 071218
1 1 309.9 07121830990 2018-07-12 30990 071218
2 2 3130.0 20180501313000B 2018-05-01 313000 20180501
3 2 3130.0 20180501313000B 2018-05-01 313000 20180501
4 3 3330.5 201804253330.50 2018-04-25 333050 20180425
5 3 3330.5 201804253330.50 2018-04-25 333050 20180425
6 4 70.0 61518 2018-06-15 7000 061518
7 4 70.0 61518 2018-06-15 7000 061518
8 5 100.0 011318 2018-01-13 10000 011318
9 5 100.0 011318 2018-01-13 10000 011318
10 6 50.0 12202017 2017-12-20 5000 12202017
11 6 50.0 12202017 2017-12-20 5000 12202017
12 7 101.0 0000014482 2017-10-01 10100 0000014482
13 7 101.0 0000014482 2017-10-01 10100 0000014482
<小时/>
formats = {'%m%d%y':6,
'%y%m%d':6,
'%Y%m%d':8,
'%m%d%Y':8}
L=[pd.to_datetime(df['inv_str'].str[:v],format=k, errors='coerce') for k,v in formats.items()]
L = [x.where(x.between('2000-01-01', pd.datetime.now())) for x in L]
s2 = reduce(lambda l,r: pd.Series.combine_first(l,r), L)
df['new'] = s2.between(s2 - pd.Timedelta(180, unit='d'), s2 + pd.Timedelta(180, unit='d'))
print (df)
cluster_id amount inv_id inv_date amt_str inv_str new
0 1 309.9 07121830990 2018-07-12 30990 071218 True
1 1 309.9 07121830990 2018-07-12 30990 071218 True
2 2 3130.0 20180501313000B 2018-05-01 313000 20180501 True
3 2 3130.0 20180501313000B 2018-05-01 313000 20180501 True
4 3 3330.5 201804253330.50 2018-04-25 333050 20180425 True
5 3 3330.5 201804253330.50 2018-04-25 333050 20180425 True
6 4 70.0 61518 2018-06-15 7000 061518 True
7 4 70.0 61518 2018-06-15 7000 061518 True
8 5 100.0 011318 2018-01-13 10000 011318 True
9 5 100.0 011318 2018-01-13 10000 011318 True
10 6 50.0 12202017 2017-12-20 5000 12202017 True
11 6 50.0 12202017 2017-12-20 5000 12202017 True
12 7 101.0 0000014482 2017-10-01 10100 0000014482 False
13 7 101.0 0000014482 2017-10-01 10100 0000014482 False
关于python - pandas 字符串以列的值结尾,然后将字符串的开头转换为日期进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52113181/
我正在 csv 上使用 hadoop 来分析一些数据。我使用sql/mysql(不确定)来分析数据,现在陷入了僵局。 我花了好几个小时在谷歌上搜索,却没有找到任何相关的东西。我需要一个查询,在该查询中
我正在为 Bootstrap 网格布局的“简单”任务而苦苦挣扎。我希望在大视口(viewport)上有 4 列,然后在中型设备上有 2 列,最后在较小的设备上只有 1 列。 当我测试我的代码片段时,似
对于这个令人困惑的标题,我深表歉意,我想不出这个问题的正确措辞。相反,我只会给你背景信息和目标: 这是在一个表中,一个人可能有也可能没有多行数据,这些行可能包含相同的 activity_id 值,也可
具有 3 列的数据库表 - A int , B int , C int 我的问题是: 如何使用 Sequelize 结果找到 A > B + C const countTasks = await Ta
我在通过以下功能编写此查询时遇到问题: 首先按第 2 列 DESC 排序,然后从“不同的第 1 列”中选择 只有 Column1 是 DISTINCT 此查询没有帮助,因为它首先从第 1 列中进行选择
使用 Bootstrap 非常有趣和有帮助,目前我在创建以下需求时遇到问题。 “使用 bootstrap 在桌面上有 4 列,在平板电脑上有 2 列,在移动设备上有 1 列”谁能告诉我正确的结构 最佳
我是 R 新手,正在问一个非常基本的问题。当然,我在尝试从所提供的示例中获取指导的同时做了功课here和 here ,但无法在我的案例中实现这个想法,即可能是由于我的问题中的比较维度更大。 我的实
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个 df , delta1 delta2 0 -1 2 0 -1 0 0 0 我想知道如何分配 delt
您好,我想知道是否可以执行以下操作。显然,我已经尝试在 phpMyAdmin 中运行它,但出现错误。也许还有另一种方式来编写此查询。 SELECT * FROM eat_eat_restaurants
我有 2 个列表(标题和数据值)。我想要将数据值列 1 匹配并替换为头文件列 1,以获得与 dataValue 列 1 和标题值列 2 匹配的值 头文件 TotalLoad,M0001001 Hois
我有两个不同长度的文件,file2 是一个很大的引用文件,我从中提取文件 1 的数据。 我有一行 awk,我通常会对其进行调整以在我的文件中进行查找和替换,但它总是在同一列中进行查找和替换。 所以对于
假设我有两个表,如下所示。 create table contract( c_ID number(1) primary key, c_name varchar2(50) not
我有一个带有 varchar 列的 H2 表,其检查约束定义如下: CONSTRAINT my_constraint CHECK (varchar_field <> '') 以下插入语句失败,但当我删
这是最少量的代码,可以清楚地说明我的问题: One Two Three 前 2 个 div 应该是 2 个左列。第三个应该占据页面的其余部分。最后,我将添加选项来隐藏和
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
在 Azure 中的 Log Analytics 中,我为 VM Heartbeat 选择一个预定义查询,我在编辑器中运行查询正常,但当我去创建警报时,我不断收到警报“查询未返回 TimeGenera
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我有一个包含 28 列的数据库。第一列是代码,第二列是名称,其余是值。 public void displayData() { con.Open(); MySqlDataAdapter
我很沮丧:每当我缩小这个网页时,一切都变得一团糟。我如何将网页居中,以便我可以缩小并且元素不会被错误定位。 (它应该是 2 列,但所有内容都合并为 1)我试过 但由于某种原因,这不起作用。 www.o
我是一名优秀的程序员,十分优秀!