【问题标题】:KeyValue error when trying to convert datetime.datetime object using strftime in Python尝试在 Python 中使用 strftime 转换 datetime.datetime 对象时出现 KeyValue 错误
【发布时间】:2019-09-19 02:46:11
【问题描述】:

我正在尝试将系列中的值从一种日期时间对象格式转换为另一种。

我使用以下方法将原始条目转换为日期时间对象:

import datetime as dt
for each in DataFrame_name['Series_name']:
    DataFrame_name['Series_name'][each] = dt.datetime.strptime(each,"%Y-%m-%d %H:%M")

这对于将字符串条目(例如 '2019-07-01 12:14')转换为日期时间对象非常有效。

但是,当我尝试将此日期时间格式转换为“%Y-%m”时,我得到一个 KeyError: datetime.datetime(2019, 7, 1, 12, 14)

for each in DataFrame_name['Series_name']:
    DataFrame_name['Series_name'][each].strftime('%Y-%m')
KeyError: datetime.datetime(2018, 2, 1, 0, 0)

以前有没有人看到/解决过这个问题?

【问题讨论】:

标签: python pandas datetime strptime strftime


【解决方案1】:

采取另一种更pandasonic的方法。

假设源DataFrame是:

                Dat  Score
0  2019-07-01 12:14    120
1  2019-07-02 10:20    130
2  2019-08-07 18:33    610

Dat 列保存为 String,Score 保存为 int64(可能是 从 Excel 或 CSV 文件中读取)。

将 Dat 列从 String 转换为 datetime,而不是导入 datetime 和你的循环,只需执行 single 语句:

df.Dat = pd.to_datetime(df.Dat)

当你print(df)时,你会得到:

                  Dat  Score
0 2019-07-01 12:14:00    120
1 2019-07-02 10:20:00    130
2 2019-08-07 18:33:00    610

Dat 的类型现在是 datetime64[ns] 和它的打印格式 就像 datetime 类型一样。

然后,不是将其重新格式化为文本,而是将其转换为 Period 月频率,再次使用一条指令:

df.Dat = df.Dat.dt.to_period('M')

结果是:

       Dat  Score
0  2019-07    120
1  2019-07    130
2  2019-08    610

Data的类型是period[M]。

【讨论】:

  • 非常感谢!那工作得很好。我最初设法使用 for 循环找到解决方案,但您的方法更快/更简单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-18
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多