我正在尝试以下(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
时,解析器似乎产生错误的输出。我错过了什么,或者这是一个错误?
答案 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