【问题标题】:Issue with date_parser: TypeError: parse() takes 1 positional argument but 2 were givendate_parser 的问题:TypeError: parse() 接受 1 个位置参数,但给出了 2 个
【发布时间】:2020-09-14 02:22:55
【问题描述】:

我收到以下错误:

TypeError: parse() takes 1 positional argument but 2 were given

我正在尝试做一个基本的数据准备,我想将日期时间信息解析为 Panda DataFrame 索引(将“日期”和“时间”列组合在一个列中)。这是一个sn-p的代码:

from pandas import read_csv
from datetime import datetime
def parse(x):
    return datetime.strptime(x,'%d-%b-%y %H:%M:%S' )

dataset = read_csv("dataset.csv", header=0, parse_dates = [['date', 'time']],
                   index_col=0, date_parser= parse)

这是原始日期和时间的样子:

date          time
25-Apr-17   19:19:40
25-Apr-17   19:19:40
25-Apr-17   19:19:45
25-Apr-17   19:19:45

我遇到了另一种使用方式:

dataset = read_csv("dataset.csv", header=0, parse_dates = {'datetime':[1,2]},
                   index_col=0, date_parser=lambda x: datetime.strptime(x,'%d-%b-%y %H:%M:%S' )

但仍然是同样的问题。 TypeError: <lambda>() takes 1 positional argument but 2 were given

我想知道你们是否可以帮助我解决这个问题?

【问题讨论】:

  • 这能回答你的问题吗? Can pandas automatically recognize dates?
  • 顺便说一句,我认为您根本不需要指定 date_parser,pandas read_csv 会自行正确完成。如果您必须这样做,请使用date_parser=lambda x, y: datetime.strptime(x+' '+y,'%d-%b-%y %H:%M:%S'))。您需要两个变量,因为您将两列传递给函数。
  • 谢谢@MrFuppes,我看了看并使用了一些想法。仍然有一些错误,如ValueError: unconverted data remains: 。我用date_parser=lambda x, y: datetime.strptime(x+' '+y,'%d-%b-%y %H:%M:%S') ,我得到了这个错误ValueError: time data ' 19:19:40 9' does not match format '%d-%b-%y %H:%M:%S'
  • 您是否检查了 .csv 中的“时间”列?它是否包含不规则格式,例如有时“19:19:40 9”?听起来我们在解析之前需要进行一些清理
  • 我仔细检查了一下,看起来“9”来自数据集中的下一列,即时间列旁边。我使用了delimiter=",",但它并没有解决问题。仍然有同样的错误。

标签: python-3.x datetime strptime dateparser


【解决方案1】:

您收到此错误是因为您选择了两列并且日期解析器正在等待单个值。

如果您想手动解析时间戳,您必须使用以下示例:

def parse(x, y):
    return datetime.strptime(f"{x} {y}", "%d-%b-%y %H:%M:%S")

dataset = read_csv("dataset.csv", header=0, parse_dates = [["date", "time"]],
                   index_col=0, date_parser=parse)

dataset

                     Unnamed: 0
date_time                      
2017-04-25 19:19:40           0
2017-04-25 19:19:40           1
2017-04-25 19:19:40           2

【讨论】:

  • f-string 会更好 ;-)
  • 感谢@Panagiotis Simakis,我尝试了您的代码,但仍然出现此错误:``` ValueError:未转换的数据仍然存在:```
【解决方案2】:

经过几次尝试和错误,我最终设法解决了这个问题。我使用 pd.to_datetime 而不是 datetime.strptime。

from pandas import read_csv
from datetime import datetime
import pandas as pd
def parse(d, t):
    dt = d+ " " +t
    return pd.to_datetime(dt)

dataset = read_csv("dataset.csv", header=0, parse_dates={'datetime': ['date', 'time']},
                   index_col=0, date_parser= parse)

输出:

datetime
2017-04-25 19:19:40
2017-04-25 19:19:40
2017-04-25 19:19:45
2017-04-25 19:19:45

我仔细检查了“日期”和“时间”的数据类型,它们的数据类型是“对象”。我不确定此方法是否适用于字符串等其他数据类型,但它解决了我的问题。

感谢大家的参与。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 2017-04-22
    • 2019-07-07
    • 2020-12-29
    • 2021-09-13
    • 2020-05-05
    • 2021-07-19
    • 2016-11-04
    相关资源
    最近更新 更多