防止在 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: '&lt;' 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: '&lt;' not supported between instances of 'str' and 'Timestamp' 如果没有换行符,可能只有一些字符怎么办? OP - 请分享更多“脏”日期示例,以便我们扩展解决方案。 这就是问题所在,正如我在 Mr.Fuppes 回答的 cmets 中指出的那样。我想但找不到任何偏差。我识别出脏的date 行并将它们全部删除。我在上面的问题中添加了我尝试过的内容。

以上是关于防止在 to_datetime() 格式中创建时间戳以便按期间分组的主要内容,如果未能解决你的问题,请参考以下文章

如何防止在 C++ 中创建对象

如何防止在 ADAM 中创建重复对象?

防止用户在 H2 中创建表

防止按Enter在Angular4中创建新行

在 Firebase 数据库中创建节点后,如何防止访问更改?

如何防止 pandas.to_datetime() 函数将 0001-01-01 转换为 2001-01-01