【问题标题】:Converting pd.to_datetime in Python在 Python 中转换 pd.to_datetime
【发布时间】:2021-03-10 08:09:12
【问题描述】:

我有一张桌子,看起来像这样:

date                     id
0   11:09:27 Nov. 26 2020   94857
1   10:49:26 Okt. 26 2020   94853
2   10:48:24 Sept. 26 2020  94852
3   9:26:33 Aug. 26 2020    94856
4   9:26:33 Jul. 26 2020    94851
5   9:24:38 Dez. 26 2020    94850
6   9:24:38 Jan. 26 2020    94849
7   9:09:08 Jun. 27 2019    32148
8   9:02:41 Mai 27 2019 32145
9   9:02:19 Apr. 27 2019    32144
10  9:02:05 Mrz. 27 2019    32143
11  9:02:05 Feb. 27 2019    32140

(initial table)

日期列格式现在是“对象”,我正在尝试使用将其更改为“日期时间”

df['date'] = pd.to_datetime(df['date'], format ='HH:MM:SS-%mm-%dd-%YYYY', errors='coerce')

因此只收到 NaT。 问题是这里的月份名称不是标准的。例如,Mai 最后没有点。 转换其格式的最佳方法是什么?

【问题讨论】:

  • 你的格式字符串看起来不对。
  • 试试format ='%H:%M:%S-%m-%d-%Y'
  • 这个也返回 NaT
  • 那是因为你的月份是缩写的,所以你需要%b而不是%m。但是,那里有一些奇怪的 4 字符缩写。您可能需要编写自己的转换器。
  • 发布一个我们可以复制的数据集样本——如果您需要更多帮助,请粘贴。

标签: python pandas dataframe datetime-format


【解决方案1】:

以下格式适用于您的大部分数据:

format="%H:%M:%S %b. %d %Y"

H 代表小时,M 代表分钟,S 代表秒,b 代表月份缩写,Y 代表年份。

正如贾斯汀在 cmets 中所说,您的月份缩写已关闭。这四个字符的缩写是非常规的,如果字符串长度为 4 个字符,则应格式化字符串以删除月份的最后一个字符。如果它是 3 个字符长,则保持原样。

编辑:

请注意,在您的数据集中,缩写以“.”结尾,因此是字符串格式中的点。

【讨论】:

  • 由于“Sept.”而失败不匹配 %b。 - 奇怪,但默认情况下它的工作原理是日期早于时间???
【解决方案2】:

您的日期列格式复杂,因此只需更改 pd.to_datetime 函数的格式:

# 11:09:27 Nov.26 2020 ---> '%I:%M:%S %b.%d %Y'
df['date'] = pd.to_datetime(df['date'], format ='%I:%M:%S %b. %d %Y', errors='coerce')

 
 output: 2020-11-26 11:09:27

【讨论】:

    【解决方案3】:

    这对我有用...即使不一致

    pd.to_datetime(df.date.str[9:]+' '+df.date.str[0:8])
    

    输入(随机生成的日期,将 7 改为 Sept.

                         date
    0   19:06:04 Mar. 19 2020
    1   17:27:11 Mar. 05 2020
    2   07:17:04 May. 05 2020
    3   04:53:50 Sep. 23 2020
    4   03:43:20 Jun. 23 2020
    5   17:35:00 Mar. 06 2020
    6   06:04:48 Jan. 15 2020
    7  12:26:14 Sept. 18 2020
    8   03:21:10 Jun. 03 2020
    9   17:37:00 Aug. 26 2020
    

    输出

    0   2020-03-19 19:06:04
    1   2020-03-05 17:27:11
    2   2020-05-05 07:17:04
    3   2020-09-23 04:53:50
    4   2020-06-23 03:43:20
    5   2020-03-06 17:35:00
    6   2020-01-15 06:04:48
    7   2020-09-18 12:26:14
    8   2020-06-03 03:21:10
    9   2020-08-26 17:37:00
    

    以下内容适用于所有月份 MMM,但由于“Sept.”而失败月。奇怪的是,如果日期早于时间,默认情况下它会正确解析它(即强制代码似乎在早于时间时起作用)???

    pd.to_datetime(df['date'].astype(str), format ="%H:%M:%S %b. %d %Y", 
    

    errors='coerce')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2020-08-06
      • 2019-07-14
      • 2014-12-24
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      相关资源
      最近更新 更多