python dateutil.parser错误(??)解析

时间:2018-06-18 10:47:40

标签: python parsing datetime python-dateutil

我正在尝试以下(python 3.6)

import dateutil.parser as dp
t1 = '0001-04-23T02:25:43.511Z'
t2 = '0001-04-23T01:25:43.511Z'
print(dp.parse(t1))
print(dp.parse(t2))

给了我

0001-04-23 02:25:43.511000+00:00
0023-01-04 01:25:43.511000+00:00

在各种类似的情况下,当年份字符串具有00XY形式和小时字符串XY时,解析器似乎产生错误的输出。我错过了什么,或者这是一个错误?

2 个答案:

答案 0 :(得分:1)

您应该使用yearfirst参数。来自docs

  

yearfirst - 是否解释模糊的第一个值   作为年份的3整数日期(例如01/05/09)。如果为True,则为第一个数字   被视为年份,否则最后一个数字被认为是   年。如果将此值设置为None,则从当前值中检索该值   parserinfo对象(它本身默认为False)。

import dateutil.parser as dp

t = '0001-04-23T01:25:43.511Z'
print(dp.parse(t, yearfirst=True))
# 0001-04-23 01:25:43.511000+00:00

答案 1 :(得分:1)

df %>% imap_dfc(function(x, name) { if (name %in% cols_to_mutate) { new_vals <- case_when( between(x, 1, 2) ~ 0, x == 3 ~ 0.5, between(x, 4, 5) ~ 1, T ~ NA_real_ ) tibble(!!quo_name(name) := x, !!quo_name(paste0(name, "_n")) := new_vals) } else { tibble(!!quo_name(name) := x) } }) #> # A tibble: 4 x 15 #> X01_01 X01_01_p X01_01_p_n X01_02 X01_02_p X01_02_p_n X01_03 X01_03_p #> <int> <int> <dbl> <int> <int> <dbl> <int> <int> #> 1 3 2 0 3 1 0 1 3 #> 2 4 3 0.5 1 1 0 5 2 #> 3 2 1 0 3 1 0 2 2 #> 4 3 3 0.5 3 3 0.5 4 2 #> # ... with 7 more variables: X01_03_p_n <dbl>, X01_04 <int>, #> # X01_04_n <dbl>, X01_05 <int>, X01_05_n <dbl>, X01_06 <int>, #> # X01_06_n <dbl> 中的was a bug已修复(初始作品here,但此特定边缘情况已修复here)。使用dateutil可以解决您的问题。

python-dateutil>=2.7.0

我不建议使用yearfirst,因为它对你的日期时间字符串的解析方式有其他影响,它本质上是一个实现细节,它在bug的情况下都可以工作(因为bug涉及解释{{ 1}}等同于import dateutil import dateutil.parser as dp print(dateutil.__version__) # 2.7.2 t1 = '0001-04-23T02:25:43.511Z' t2 = '0001-04-23T01:25:43.511Z' print(dp.parse(t1)) 0001-04-23 02:25:43.511000+00:00 print(dp.parse(t2)) 0001-04-23 01:25:43.511000+00:00 ,它不是。)

如果你 知道你有一个ISO-8601格式的日期时间,dateutil.parser.isoparse会更快更严格,并且没有这个错误。它也在2.7.0版本中引入:

0001