【问题标题】:re.search "TypeError: expected string or bytes-like object"re.search "TypeError: 预期的字符串或类似字节的对象"
【发布时间】:2019-11-05 13:48:24
【问题描述】:

在我的数据框“df”中,我有一个包含 500 行的“日期时间”列。每行包含一个字符串对象,如下所示:2018-12-23T10:42:09.690Z

将日期和时间分隔在两个不同的列(日期和时间)中会非常有帮助。

日期 2018-12-23

时间 10:42:09.69

我试过以下代码:

#Input:
string = df['Datetime']
#Date
regex_res = re.search(r'(([0-9]{4})[-]([0-9]{2})[-]([0-9]{2}))', string)
print(regex_res.group())

#Output:
TypeError: expected string or bytes-like object

如果我只使用特定的字符串,例如“2018-12-23T10:42:09.690Z”,它确实有效。

#Input:
test = "2018-12-23T10:42:09.690Z"
#Date
regex_res = re.search(r'(([0-9]{4})[-]([0-9]{2})[-]([0-9]{2}))', test)
print(regex_res.group())
#Output:
2018-12-23

我做过的测试:

检查空值。输出给了我每一行的“False”。

nan_rows = [df['Datetime'].isnull()]

每一行的类型都是“class 'str'”

print (df['Datetime'].apply(type))

我做错了什么? 感谢您的帮助!

问候,

艾丽

【问题讨论】:

  • 完美运行!太感谢了!也感谢您的链接!天堂! :)

标签: python regex datetime


【解决方案1】:

要将日期和时间从您可以使用的现有列中提取到单独的列中

df[['date', 'time']] = df['Datetime'].str.extract(r'\b(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}\.\d*)Z\b')

或者,去掉毫秒部分的尾随零:

 df[['date', 'time']] = df['Datetime'].str.extract(r'\b(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}\.\d*?)0*Z\b')

正则表达式是

\b(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2}\.\d*?)0*Z\b

pattern demo

详情

  • \b - 单词边界(如果日期时间可以粘贴到单词字符上,则删除)
  • (\d{4}-\d{2}-\d{2}) - 第 1 组(日期):4 位、-、2 位、- 和 2 位
  • T - T
  • (\d{2}:\d{2}:\d{2}\.\d*?) - 第 2 组(时间):2 位数字,冒号,重复 3 次,然后是 . 和任意 0 位或更多位,但尽可能少
  • 0* - 零个或多个 0 字符
  • Z - Z
  • \b - 单词边界(如果日期时间可以粘贴到单词字符上,则删除)

【讨论】:

  • 完美运行!太感谢了!也感谢您的链接!天堂! :)
猜你喜欢
  • 2019-10-31
  • 1970-01-01
  • 2018-10-17
  • 2020-07-08
  • 2018-05-04
  • 2017-08-29
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多