【问题标题】:python - convert multiple string datetimes format into a specific date formatpython - 将多个字符串日期时间格式转换为特定的日期格式
【发布时间】:2020-04-05 14:22:16
【问题描述】:

我的这个日期列有 6 种不同的日期字符串大小:

df = pd.DataFrame({'date': {0: '2020-03-21T10:13:08',  1: '2020-03-21T17:43:03',  2: '2020-03-21T13:13:30',  3: '2020-03-21T20:43:02',  4: '3/8/20 5:31',  5: '3/8/20 5:19',  6: '3/22/20 23:45',  7: '3/22/20 23:45',  8: '2/1/2020 11:53',  9: '2/1/2020 10:53',  10: '1/31/2020 15:20',  11: '1/31/2020 10:37',  12: '2020-04-04 23:34:21',  13: '2020-04-04 23:34:21'}}, 
             index=range(0,14))

我需要将所有这些不同的日期时间字符串转换为日期格式。我使用的方法是:

  1. 找到第一个空格并提取日期

  2. 在给定特定字符串长度的情况下更改其格式(每个字符串长度都有其特定的日期格式,您可以在下面的 format 参数中看到)

  3. 在数据帧df 的相应行中执行 (2)。

你可以在这里看到这种方法:

df.loc[df["date"].str.find(" ") == 10, "date"] = pd.to_datetime(df.loc[df["date"].str.find(" ") == 10, "date"].str[0:10])
df.loc[df["date"].str.find(" ") == -1, "date"] = pd.to_datetime(df.loc[df["date"].str.find(" ") == 10, "date"].str[0:10])
df.loc[df["date"].str.find(" ") == 6, "date"] = pd.to_datetime(df.loc[df["date"].str.find(" ") == 6, "date"].str[0:6], format="%m/%d/%y")
df.loc[df["date"].str.find(" ") == 7, "date"] = pd.to_datetime(df.loc[df["date"].str.find(" ") == 7, "date"].str[0:7], format="%m/%d/%y")
df.loc[df["date"].str.find(" ") == 8, "date"] = pd.to_datetime(df.loc[df["date"].str.find(" ") == 8, "date"].str[0:8], format="%m/%d/%Y")
df.loc[df["date"].str.find(" ") == 9, "date"] = pd.to_datetime(df.loc[df["date"].str.find(" ") == 9, "date"].str[0:9], format="%m/%d/%Y")

在第 3 步之前我会一直很完美,我正在尝试找到一种解决方法来更改数据框中的所有格式,但我不明白为什么它没有给出它应该给出的东西。有什么建议吗?

顺便说一句,它必须是可扩展的(我每个格式字符串有很多行)

【问题讨论】:

  • 为什么是-1?有一个可重现的例子,一个具体的问题陈述,StackOverflow 中没有类似的问题。有什么反馈吗?

标签: python pandas date datetime


【解决方案1】:

对我来说,如果输出是日期时间,则将所有值转换为日期时间,然后使用 Series.dt.floor 删除时间,如果输出是 python 日期,则使用 Series.dt.date 删除时间:

df['date'] = pd.to_datetime(df['date']).dt.floor('d')
#dates
#df['date'] = pd.to_datetime(df['date']).dt.date
print (df)
         date
0  2020-03-21
1  2020-03-21
2  2020-03-21
3  2020-03-21
4  2020-03-08
5  2020-03-08
6  2020-03-22
7  2020-03-22
8  2020-02-01
9  2020-02-01
10 2020-01-31
11 2020-01-31
12 2020-04-04
13 2020-04-04

您的解决方案应该简化 - 获取前 10 个字母,然后按可能的空间分割并获取第一个值:

df['date'] = pd.to_datetime(df['date'].str[:10].str.split().str[0])

【讨论】:

  • 相当不错的解决方案,我从没想过使用dt.floor。但是,您怎么知道pd.to_datetime() 是否不会误导数月的日子,反之亦然? (这就是为什么我指定了不同于pd.to_datetime() 的标准格式的原因:%Y-%m-%d
  • @Chris - 默认情况下 to_datetime 使用月份优先,如 MMDDYYYY。如果混合另一种格式,那就更复杂了。
  • 好吧,明白了。但是,它是如何读取格式 YYYY-MM-DD 的呢? pandas 如何知道它是否不是 YYYY-DD-MM?
  • @Chris - 不幸的是没有,那么像this这样的必要方法
【解决方案2】:
import pandas as pd

df = pd.DataFrame({'date': {0: '2020-03-21T10:13:08',  1: '2020-03-21T17:43:03',  2: '2020-03-21T13:13:30',  3: '2020-03-21T20:43:02',  4: '3/8/20 5:31',  5: '3/8/20 5:19',  6: '3/22/20 23:45',  7: '3/22/20 23:45',  8: '2/1/2020 11:53',  9: '2/1/2020 10:53',  10: '1/31/2020 15:20',  11: '1/31/2020 10:37',  12: '2020-04-04 23:34:21',  13: '2020-04-04 23:34:21'}}, 
             index=range(0,14))
df
    date
0   2020-03-21T10:13:08
1   2020-03-21T17:43:03
2   2020-03-21T13:13:30
3   2020-03-21T20:43:02
4   3/8/20 5:31
5   3/8/20 5:19
6   3/22/20 23:45
7   3/22/20 23:45
8   2/1/2020 11:53
9   2/1/2020 10:53
10  1/31/2020 15:20
11  1/31/2020 10:37
12  2020-04-04 23:34:21
13  2020-04-04 23:34:21

df['date'] = pd.to_datetime(df['date'])
df
    date
0   2020-03-21 10:13:08
1   2020-03-21 17:43:03
2   2020-03-21 13:13:30
3   2020-03-21 20:43:02
4   2020-03-08 05:31:00
5   2020-03-08 05:19:00
6   2020-03-22 23:45:00
7   2020-03-22 23:45:00
8   2020-02-01 11:53:00
9   2020-02-01 10:53:00
10  2020-01-31 15:20:00
11  2020-01-31 10:37:00
12  2020-04-04 23:34:21
13  2020-04-04 23:34:21

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多