【问题标题】:How to convert mixed datetime format records using pandas?如何使用 pandas 转换混合日期时间格式记录?
【发布时间】:2021-09-26 07:53:32
【问题描述】:

我有如下图所示的 pandas 列

23/6/2011 7:00     
21/4/1998 05:00       
17/02/1990  
11/01/1985 30:30:01       
26/02/1976 
45:42:7

您可以看到该列没有任何固定的日期列格式。

所以,当我尝试将它们转换为日期时间列时,大部分记录变为NaN

我尝试了以下方法,但都不起作用

df['test_date'] = pd.to_datetime(df['test_date']) # it leads to long integer like 130825789000000000
df['test_date'] = pd.to_datetime(df['test_date'],format='%d/%m/%Y %H:%M', errors='coerce') #this makes all other format records as NA

我希望我的输出如下所示。如果以下输出不可能,我至少希望将date values 作为输出

23/6/2011  07:00:00    
21/4/1998  05:00:00       
17/02/1990 00:00:00
11/01/1985 10:30:01       
26/02/1976 00:00:00

【问题讨论】:

  • 我无法重现 df['test_date'] = pd.to_datetime(df['test_date']) 正确解析日期与 00:00:00 缺少的时间。
  • 更新了我的样本数据@AndrejKesely
  • 你想怎么解析时间30:30:01
  • 我知道这是无效记录。因此,我不想制作该记录 NA,而是像 11/01/1985 00:00:00 一样保留它。如果不可能,我只想保留整列的日期值
  • 查看我遇到的另一个问题的更新示例

标签: python python-3.x pandas dataframe datetime


【解决方案1】:

试试:

from dateutil import parser


def parse_dates(x):
    out = []
    for v in x:
        try:
            out.append(pd.to_datetime(v))
            continue
        except parser._parser.ParserError:
            v = v.split()[0]
            try:
                out.append(pd.to_datetime(v))
            except:
                out.append(pd.NaT)
    return out


df["test_date"] = parse_dates(df["test_date"])
print(df)

打印:

            test_date
0 2011-06-23 07:00:00
1 1998-04-21 05:00:00
2 1990-02-17 00:00:00
3 1985-11-01 00:00:00
4 1976-02-26 00:00:00
5                 NaT

df 已使用:

             test_date
0       23/6/2011 7:00
1      21/4/1998 05:00
2           17/02/1990
3  11/01/1985 30:30:01
4           26/02/1976
5              45:42:7

【讨论】:

    【解决方案2】:

    更简单:

    >>> pd.to_datetime(df['test_date'], infer_datetime_format=True)
    
    0   2011-06-23 07:00:00
    1   1998-04-21 05:00:00
    2   1990-02-17 00:00:00
    3   1985-11-01 10:30:01
    4   1976-02-26 00:00:00
    Name: test_date, dtype: datetime64[ns]
    

    旧答案

    # from dateutil import parser
    >>> df['test_date'].map(parser.parse)
    
    0   2011-06-23 07:00:00
    1   1998-04-21 05:00:00
    2   1990-02-17 00:00:00
    3   1985-11-01 10:30:01
    4   1976-02-26 00:00:00
    Name: test_date, dtype: datetime64[ns]
    

    【讨论】:

    • 嗨 Corralien,假设有一个无效的日期值 32/05/1998 00:00:00。它会成为NA吗?
    • 因为我收到这样的错误ParserError: hour must be in 0..23: 45:42.7
    • 当我尝试下面的pd.to_datetime(df['test_date'], infer_datetime_format=True,errors='ignore'),我得到一个错误AttributeError: Can only use .dt accessor with datetimelike values
    • 例如:如果记录的值类似于10/05/2011 45:02:07,由于小时值不正确,我想保留日期值而不是NaT。因此,我试图为我的所有记录保留 date 值。如果我们不能保留时间戳也没关系
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2020-06-18
    • 2019-10-07
    相关资源
    最近更新 更多