防止在 to_datetime() 格式中创建时间戳以便按期间分组
Posted
技术标签:
【中文标题】防止在 to_datetime() 格式中创建时间戳以便按期间分组【英文标题】:preventing timestamp creation in to_datetime() formatting in order to group by periods 【发布时间】:2021-11-20 06:41:44 【问题描述】:我的熊猫df3
很大,大致是这样的:
df3 = pd.DataFrame([['23.02.2012', '23.02.2012', 'aaa'], ['27.02.2014', '27.02.2014', 'bbb'], ['17.08.2018', '17.08.2018', 'ccc'], ['22.07.2019', '22.07.2019', 'ddd']], columns=['date', 'period', 'text'])
如果日期对应,我想让列 period
显示以下句点
df3['date'] = pd.to_datetime(df3['date'], errors = 'coerce')
df3['period'] = df3['date']
col_name = 'period'
strt_col = df3.pop(col_name)
df3.insert(5, col_name, strt_col)
mask1 = (df3['date'] >= '1990-10-14') & (df3['date'] < '1994-11-10')
mask2 = (df3['date'] >= '1994-11-10') & (df3['date'] < '1999-10-1')
mask3 = (df3['date'] >= '1999-10-1') & (df3['date'] < '2004-6-13')
mask4 = (df3['date'] >= '2004-6-13') & (df3['date'] < '2009-8-30')
mask5 = (df3['date'] >= '2009-8-30') & (df3['date'] < '2014-10-14')
mask6 = (df3['date'] >= '2014-10-14') & (df3['date'] < '2019-11-26')
mask7 = (df3['date'] >= '2019-11-26') & (df3['date'] < '2021-9-20')
df3.loc[mask1, 'period'] = '1990-1994'
df3.loc[mask2, 'period'] = '1994-1999'
df3.loc[mask3, 'period'] = '1999-2004'
df3.loc[mask4, 'period'] = '2004-2009'
df3.loc[mask5, 'period'] = '2009-2014'
df3.loc[mask6, 'period'] = '2014-2019'
df3.loc[mask7, 'period'] = '2019-2021'
df3 = df3.sort_values(by = ['period'])
.
.
.
投掷df3 = df3.sort_values(by = ['period'])
TypeError: '<' not supported between instances of 'str' and 'Timestamp'
如果我运行代码直到df3.loc[mask7, 'period'] = '2019-2021'
,输出如下所示:
col 'period' 有 1994-1999
和 'date' 有干净的 10/2/1998
到目前为止,99,9 % 的行都很好。
问题:正好有 100 行有 col 'period' 10/2/2021 12:00:00 AM
并且 col 'date' 有 clean 10/2/2021
所需的输出 col 'period':2019-2021
即使“日期”值是干净的并且格式正确(我仔细检查过,该单元格中没有其他字符),但随后它的格式并不像所有其他行一样。为什么?
以下是所有 date
单元格(日/月/年),它们是错误格式的来源:
'date' after to_datetime()
10/2/2021
10/2/2021
10/2/2021
10/2/2021
10/3/2021
10/3/2021
10/3/2021
10/3/2021
10/3/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/5/2021
10/6/2021
10/6/2021
11/1/2021
11/1/2021
11/1/2021
11/1/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/2/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/3/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/5/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
11/6/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/1/2021
12/2/2021
12/2/2021
12/2/2021
12/3/2021
12/3/2021
12/4/2021
12/4/2021
12/5/2021
12/5/2021
'period'
10/2/2021 0:00
10/2/2021 0:00
10/2/2021 0:00
10/2/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/3/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/5/2021 0:00
10/6/2021 0:00
10/6/2021 0:00
11/1/2021 0:00
11/1/2021 0:00
11/1/2021 0:00
11/1/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/2/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/3/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/5/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
11/6/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/1/2021 0:00
12/2/2021 0:00
12/2/2021 0:00
12/2/2021 0:00
12/3/2021 0:00
12/3/2021 0:00
12/4/2021 0:00
12/4/2021 0:00
12/5/2021 0:00
12/5/2021 0:00
我在pd.to_datetime
之后添加了df3['question_date'].dt.date
,导致出现以下错误:
TypeError: '>=' not supported between instances of 'datetime.date' and 'str'
【问题讨论】:
【参考方案1】:用\n
分割并使用第一个元素怎么样?这将“清理”数据。
类似于以下内容:
val1 = '27.02.2014\nwer'
val2 = '27.02.2014'
date1 = val1.split('\n')[0]
date2 = val2.split('\n')[0]
print(date1)
print(date2)
输出
27.02.2014
27.02.2014
【讨论】:
df3 = df3.sort_values(by = ['period'])
抛出错误:TypeError: '<' not supported between instances of 'str' and 'Timestamp'
如果没有换行符,可能只有一些字符怎么办?
OP - 请分享更多“脏”日期示例,以便我们扩展解决方案。
这就是问题所在,正如我在 Mr.Fuppes 回答的 cmets 中指出的那样。我想但找不到任何偏差。我识别出脏的date
行并将它们全部删除。我在上面的问题中添加了我尝试过的内容。以上是关于防止在 to_datetime() 格式中创建时间戳以便按期间分组的主要内容,如果未能解决你的问题,请参考以下文章