百度AI在代码(Python)中的简单使用体验

一. 前言

百度AI在代码(VBA)中的简单使用体验 | Lian (kyouichirou.github.io)中, 体验了百度AI在VBA上的使用, 但是测试结果表明这种AI工具在VBA这个领域的代码使用体验相当糟糕.

现在来测试python, 相对于vba, python领域有绝对的优势:

  • 资料绝对充足
  • 代码规范性更好
  • python语言本身更为"易于阅读"

相对的, 不能测试太容易的代码, 要有一些"难度"来挑战.

二. 1

时间处理问题, 这个是个看似没什么难度, 但是很容易掉进坑里的问题.

由于各国使用的时间格式的差异, 以及不同软件实现的差异, 导致时间的转换很容易搞乱.

这个是相对简单的, 因为这是一个标准的iso8601格式的时间.

使用python将"2021-10-01T07:29:47.585830"转为北京时间

在Python中, 您可以使用datetime模块将UTC时间转换为北京时间. 请注意, "2021-10-01T07:29:47.585830"是一个ISO 8601格式的日期时间字符串, 我们需要将其解析为datetime对象, 然后再进行转换.

下面是一个示例代码:

from datetime import datetime, timezone

# UTC时间字符串
utc_time_str = "2021-10-01T07:29:47.585830"

# 解析UTC时间字符串为datetime对象
utc_time = datetime.fromisoformat(utc_time_str)

# 将UTC时间转换为北京时间( UTC+8) 
beijing_time = utc_time.replace(tzinfo=timezone.utc).astimezone(timezone(8))

# 输出北京时间
print(beijing_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

此代码将UTC时间字符串解析为datetime对象, 然后使用replace方法将时区信息设置为UTC, 然后使用astimezone方法将时区转换为北京时间( UTC+8) . 最后, 使用strftime方法将结果格式化为字符串.


尽管这是比较简单的问题, 但是百度AI还是扑街, "timezone(8)", 这里显然是错的, 因为datetime.timezone()支持的是timedelta参数

class datetime.timezone(offset,name=None)

Theoffset argument must be specified as a timedelta object representing the difference between the local time and UTC. It must be strictly between -timedelta(hours=24) and timedelta(hours=24), otherwise ValueError is raised.

三. 2

变化一下时间的格式

使用python将"'2022-11-06 01:16:21 AM PST'"转为北京时间

Python中, 您可以使用pytz库来处理时区转换. 首先, 需要确保安装了pytz库, 可以通过以下命令安装:

pip install pytz

接下来, 您可以使用以下代码将UTC时间转换为北京时间:

from datetime import datetime
import pytz

utc_time_str = "2022-11-06 01:16:21 AM PST"
# 这里的错误太明显, 这个字符串显然不满足iso格式的要求, fromisoformat
utc_time = datetime.fromisoformat(utc_time_str)

# 将UTC时间转换为北京时间
beijing_tz = pytz.timezone("Asia/Shanghai")
beijing_time = utc_time.astimezone(beijing_tz)

# 输出北京时间
print(beijing_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

这段代码将输入的UTC时间字符串解析为datetime对象, 然后使用pytz库中的timezone函数将其转换为北京时间. 最后, 使用strftime方法将结果格式化为字符串并输出.


你的代码有问题, 出现Invalid isoformat string: '2022-11-06 01:16:21 AM PST'错误

您提到的错误信息表明, 您在尝试将一个字符串转换为日期时间对象时出现了问题. 这个错误提示表示datetime.fromisoformat()函数无法解析您提供的字符串.

这是因为datetime.fromisoformat()函数期望的输入是一个符合ISO 8601标准的日期时间字符串. 在你的字符串 '2022-11-06 01:16:21 AM PST' 中, PST( 太平洋标准时间) 是一个时区信息, 而不是ISO 8601标准的一部分. 这导致datetime.fromisoformat()无法正确解析你的字符串.

对于这种问题, 你需要将时区信息从字符串中移除, 或者在转换为日期时间对象后再设置时区. 以下是一个解决方案:

from datetime import datetime, timezone

# 你的原始字符串
utc_time_str = "2022-11-06 01:16:21 AM PST"

# 将PST移除, 并去掉AM/PM标识
utc_time_str_without_tz = utc_time_str.replace('AM PST', '').replace('PM PST', '')

# 解析为datetime对象
# 还是这里出现错误, 同样不满足iso格式
utc_time = datetime.fromisoformat(utc_time_str_without_tz)

# 设置时区为UTC
utc_time = utc_time.replace(tzinfo=timezone.utc)

# 如果你想转换为北京时间, 你可以这样做: 
beijing_tz = pytz.timezone('Asia/Shanghai')
beijing_time = utc_time.astimezone(beijing_tz)

print(beijing_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

这个代码将先移除时区信息, 然后解析日期时间字符串为datetime对象, 并将时区设置为UTC. 如果您想转换为北京时间, 您可以进一步使用astimezone()函数来实现.


下面内容尝试让百度修正

你的代码有问题, 出现Invalid isoformat string: '2022-11-06 01:16:21 '错误

这个错误提示表明您在尝试使用datetime.fromisoformat()函数将一个字符串转换为日期时间对象时遇到了问题. 该函数期望接收一个符合ISO 8601标准的日期时间字符串, 但是您提供的字符串可能不符合这个标准, 因此出现了这个错误.

通常, datetime.fromisoformat()函数能够解析的字符串格式应该是类似于'YYYY-MM-DDTHH:MM:SS', 其中T是日期和时间的分隔符.

看起来您的字符串中缺少了时间和日期的分隔符T, 而且日期部分的格式也不完全符合标准. 为了解决这个问题, 您需要确保您的字符串符合ISO 8601标准, 并使用适当的格式进行解析.

以下是一个示例, 展示如何正确地解析一个日期时间字符串:

from datetime import datetime

date_time_str = "2022-11-06 01:16:21"

# 解析日期时间字符串
date_time_obj = datetime.fromisoformat(date_time_str)

# 打印解析后的日期时间对象
print(date_time_obj)

但是令人遗憾的是, 百度AI在这里出现了上下文不关联

四. 3

那请正确将"'2022-11-06 01:16:21 AM PST'"转为北京时间

要将"'2022-11-06 01:16:21 AM PST'"转换为北京时间, 您需要首先将PST时区转换为UTC时区, 然后再将UTC时区转换为北京时间.

以下是转换步骤的示例代码:

from datetime import datetime, timezone, pytz

# 输入的PST时间字符串
pst_time_str = "2022-11-06 01:16:21 AM PST"

# 将字符串解析为datetime对象
pst_time = datetime.strptime(pst_time_str, "%Y-%m-%d %I:%M:%S %p %Z")

# 将PST时区转换为UTC时区
utc_time = pst_time.replace(tzinfo=pytz.timezone("America/Los_Angeles")).astimezone(timezone.utc)

# 将UTC时区转换为北京时间
beijing_tz = pytz.timezone("Asia/Shanghai")
beijing_time = utc_time.astimezone(beijing_tz)

# 打印北京时间
print(beijing_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

运行这段代码将输出北京时间的日期时间字符串.


重新尝试依然还是出现错误.

你的代码还是有问题, 出现"time data '2022-11-06 01:16:21 AM PST' does not match format '%Y-%m-%d %I:%M:%S %p %Z'"错误

非常抱歉, 我之前的代码示例存在错误. 您指出的错误是由于在Python中, strptime()函数无法直接处理带有时区信息的日期时间字符串. 因此, 需要采取其他方法来处理带时区信息的日期时间字符串.

下面是一个更正确的代码示例, 它使用第三方库dateutil来解析带时区信息的日期时间字符串:

from datetime import datetime
from dateutil import tz

# 输入的带时区信息的日期时间字符串
pst_time_str = "2022-11-06 01:16:21 AM PST"

# 将字符串解析为datetime对象
# 规则出现不匹配的问题
pst_time = datetime.strptime(pst_time_str, "%Y-%m-%d %I:%M:%S %p %Z")

# 将PST时区转换为UTC时区
pst_tz = tz.gettz('America/Los_Angeles')
utc_time = pst_time.replace(tzinfo=pst_tz).astimezone(timezone.utc)

# 将UTC时区转换为北京时间
beijing_tz = pytz.timezone('Asia/Shanghai')
beijing_time = utc_time.astimezone(beijing_tz)

# 打印北京时间
print(beijing_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

在这个示例中, 我们首先使用dateutil中的gettz()函数获取PST时区的对象. 然后, 我们将输入的日期时间字符串解析为datetime对象, 并将PST时区替换为UTC时区. 最后, 我们将UTC时区转换为北京时间并打印输出.

请注意, 为了运行上述代码示例, 您需要先安装dateutil库. 您可以使用以下命令来安装它:

pip install dateutil

希望这个更正的代码示例能够解决您的问题. 如有任何进一步的疑问, 请随时提问.


经过了一些列的反馈修正, 但还是出现错误

五. 4

重新尝试开始的问题.

使用python将"2021-10-01T07:29:47.585830"转为北京时间

要将"2021-10-01T07:29:47.585830"转换为北京时间, 您可以使用Python的datetimepytz库. 以下是转换的代码示例:

from datetime import datetime
import pytz

# 输入的UTC时间字符串
utc_time_str = "2021-10-01T07:29:47.585830"

# 将字符串解析为datetime对象
utc_time = datetime.strptime(utc_time_str, "%Y-%m-%dT%H:%M:%S.%f")

# 创建一个UTC时区对象
utc_tz = pytz.utc

# 将UTC时区转换为北京时间
beijing_tz = pytz.timezone('Asia/Shanghai')
beijing_time = utc_time.replace(tzinfo=utc_tz).astimezone(beijing_tz)

# 打印北京时间
print(beijing_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

运行上述代码将输出北京时间的日期时间字符串.


意外的是这个问题, 百度AI终于给出了正确的代码.

这里默认"2021-10-01T07:29:47.585830"这个时间是UTC时间, 和北京时间相差8个小时.

六. 5

使用python将"2018/07/05 16:22:01JST"转为北京时间

要将"2018/07/05 16:22:01JST"转换为北京时间, 您可以使用Python的datetimepytz库. 首先, 您需要确定JST( 日本标准时间) 与北京时间之间的时差. 根据您提供的时间, JST比北京时间晚1小时.

以下是转换的代码示例:

from datetime import datetime
import pytz

# 输入的JST时间字符串
jst_time_str = "2018/07/05 16:22:01JST"

# 将字符串解析为datetime对象
jst_time = datetime.strptime(jst_time_str, "%Y/%m/%d %H:%M:%SJST")

# 创建JST和北京时区对象
jst_tz = pytz.timezone('Asia/Tokyo')
beijing_tz = pytz.timezone('Asia/Shanghai')

# 将JST时区转换为北京时间, 考虑时差
# 这里出现更为离谱的错误, 没有导包
# 这里的处理也是错误的, 都已经转换为北京时区, 不需要再额外减去一个小时的时差
beijing_time = jst_time.replace(tzinfo=jst_tz).astimezone(beijing_tz) - timedelta(hours=1)

# 打印北京时间
print(beijing_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

在这个示例中, 我们首先将输入的JST时间字符串解析为datetime对象. 然后, 我们创建了JST和北京时区对象. 接下来, 我们将JST时区转换为北京时间, 并考虑时差减去1小时. 最后, 我们打印北京时间的日期时间字符串.


经过前面的训练, 这里百度AI依然还是无法正确处理这个问题.

七. 小结

从上述结果来看, 百度AI在面对稍微上点难度的问题, 哪怕是Python这种高度热门的语言, 而且出现的都是很低级的错误.

尽管不停的尝试修正其错误, 但是还是不停的出错.

img

甚至出现更为严重的错误, 自相矛盾.

八. 附录

关于日期时间的各种符号:

Directive Meaning Example Notes
%a Weekday as locale’s abbreviated name. Sun, Mon, …, Sat (en_US);So, Mo, …, Sa (de_DE) (1)
%A Weekday as locale’s full name. Sunday, Monday, …, Saturday (en_US);Sonntag, Montag, …, Samstag (de_DE) (1)
%w Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. 0, 1, …, 6
%d Day of the month as a zero-padded decimal number. 01, 02, …, 31 (9)
%b Month as locale’s abbreviated name. Jan, Feb, …, Dec (en_US);Jan, Feb, …, Dez (de_DE) (1)
%B Month as locale’s full name. January, February, …, December (en_US);Januar, Februar, …, Dezember (de_DE) (1)
%m Month as a zero-padded decimal number. 01, 02, …, 12 (9)
%y Year without century as a zero-padded decimal number. 00, 01, …, 99 (9)
%Y Year with century as a decimal number. 0001, 0002, …, 2013, 2014, …, 9998, 9999 (2)
%H Hour (24-hour clock) as a zero-padded decimal number. 00, 01, …, 23 (9)
%I Hour (12-hour clock) as a zero-padded decimal number. 01, 02, …, 12 (9)
%p Locale’s equivalent of either AM or PM. AM, PM (en_US);am, pm (de_DE) (1), (3)
%M Minute as a zero-padded decimal number. 00, 01, …, 59 (9)
%S Second as a zero-padded decimal number. 00, 01, …, 59 (4), (9)
%f Microsecond as a decimal number, zero-padded to 6 digits. 000000, 000001, …, 999999 (5)
%z UTC offset in the form ±HHMM[SS[.ffffff]] (empty string if the object is naive). (empty), +0000, -0400, +1030, +063415, -030712.345216 (6)
%Z Time zone name (empty string if the object is naive). (empty), UTC, GMT (6)
%j Day of the year as a zero-padded decimal number. 001, 002, …, 366 (9)
%U Week number of the year (Sunday as the first day of the week) as a zero-padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. 00, 01, …, 53 (7), (9)
%W Week number of the year (Monday as the first day of the week) as a zero-padded decimal number. All days in a new year preceding the first Monday are considered to be in week 0. 00, 01, …, 53 (7), (9)
%c Locale’s appropriate date and time representation. Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE) (1)
%x Locale’s appropriate date representation. 08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE) (1)
%X Locale’s appropriate time representation. 21:30:00 (en_US);21:30:00 (de_DE) (1)
%% A literal '%' character. %

Several additional directives not required by the C89 standard are included for convenience. These parameters all correspond to ISO 8601 date values.

Directive Meaning Example Notes
%G ISO 8601 year with century representing the year that contains the greater part of the ISO week (%V). 0001, 0002, …, 2013, 2014, …, 9998, 9999 (8)
%u ISO 8601 weekday as a decimal number where 1 is Monday. 1, 2, …, 7
%V ISO 8601 week as a decimal number with Monday as the first day of the week. Week 01 is the week containing Jan 4. 01, 02, …, 53 (8), (9)