获取 UTC 'T' 和 'Z' 以显示在 DataFrame 列中

Get UTC 'T' and 'Z' to show in DataFrame Column

提问人:Programming_Learner_DK 提问时间:7/26/2023 最后编辑:FObersteinerProgramming_Learner_DK 更新时间:7/26/2023 访问量:45

问:

以一种日期时间格式导入数据帧,并输入到需要此 UTC 格式日期的 API 服务中(注意 和 ):TZ

2023-07-26T11:04:23.893Z

值得注意的是,这将被转换为最终答案可以产生一个字符串。但是,如果本机时间处理可以做到这一点,那将是更干净的解决方案。JSONPandas

在个别日期,而不是在 ,我是这样做的:DataFrame

due_date_end = datetime.now() + relativedelta(months=+3)
due_date_end = due_date_end.isoformat('T') + 'Z'

当我尝试在列上使用该方法时,我收到异常。.isoformat()df

我还尝试了以下方法:

读取文件时解析日期

df = pd.read_csv('my_test_file.csv',parse_dates=['job_due_date'])

使用我在 SO 上看到的相关答案进行转换:

df['due_date'] = pd.to_datetime(end_user_df['job_due_date']).dt.tz_localize('UTC')

另一个基于 SO 答案的变体:

end_user_df['due_date'] = pd.to_datetime(end_user_df['job_due_date']).dt.tz_localize('UTC') 
end_user_df['due_date'] = end_user_df['due_date'].to_string().strftime("%Y-%m-%dT%H:%M:%S%Z")

接下来我应该尝试什么?

python 熊猫 日期时间 UTC ISO8601

评论

1赞 FObersteiner 7/26/2023
将 String 转换为 DateTime (pd.to_datetime, parse_dates) 后,您将拥有 DateTime 数据类型,而不是 String。datetime 数据类型没有“format”。只有字符串表示形式的 datetime 具有;因此,如果你想让 T 和 Z “显示”,你必须转换为字符串,例如 with(请注意,Z 之前没有 %)。.strftime("%Y-%m-%dT%H:%M:%SZ")
0赞 Programming_Learner_DK 7/26/2023
@FObersteiner,我得到以下异常:Traceback (most recent call last): File "c:\Users\d.kelly\Desktop\Python\PLEX_API_Test\plex_api_take_3.py", line 16, in <module> end_user_df['due_date'] = end_user_df['job_due_date'].to_string().strftime("%Y-%m-%dT%H:%M:%S%Z") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'strftime'
1赞 FObersteiner 7/26/2023
如果是 DateTime 列,则使用访问器 like 获取字符串类型列end_user_df['due_date']dtend_user_df['job_due_date'].dt.strftime("%Y-%m-%dT%H:%M:%SZ")
0赞 Programming_Learner_DK 7/26/2023
@FObersteiner - 奏效了!TY - 发布为答案,以便我可以为未来的 SO 搜索者标记这样?
0赞 FObersteiner 7/26/2023
这里有一个类似的问题,尽管我认为仍然缺少的是如何在小数秒内获得一定的精度(例如 2023-07-26T11:04:23.893Z vs. 2023-07-26T11:04:23.893111Z

答:

1赞 FObersteiner 7/26/2023 #1

原则上,您需要将表示为字符串的 datetime 转换为用于处理数据的 datetime 数据类型。若要生成具有特定格式的输出(字符串),请使用命名空间的方法。请注意,对于 ,您必须使用文字“Z”来表示 UTC(而不是 )。strftimedtstrftime%Z

作为对类似问题的答案的补充,下面是一个示例,说明如何在 ISO 格式输出中获取不同精度的小数秒。

import pandas as pd

df = pd.DataFrame({"date": ["2023-07-26T11:04:23.893001Z"]})

# for working with the data, convert to datetime data type
df["date_dt"] = pd.to_datetime(df["date"])

print(df.dtypes)
# date                    object
# date_dt    datetime64[ns, UTC]
# dtype: object

# microsecond precision fractional seconds: just use %f
print(df["date_dt"].dt.strftime("%Y-%m-%dT%H:%M:%S.%fZ"))
# 0    2023-07-26T11:04:23.893001Z
# Name: date_dt, dtype: object

# millisecond precision fractional seconds: truncate output and add 'Z'
print(df["date_dt"].dt.strftime("%Y-%m-%dT%H:%M:%S.%f").str[:-3] + "Z")
# 0    2023-07-26T11:04:23.893Z
# Name: date_dt, dtype: object

# no fractional seconds at all: no %f
print(df["date_dt"].dt.strftime("%Y-%m-%dT%H:%M:%SZ"))
# 0    2023-07-26T11:04:23Z
# Name: date_dt, dtype: object