【问题标题】:Datetime in pandas dataframe will not subtract from each other熊猫数据框中的日期时间不会相互减去
【发布时间】:2017-11-19 21:50:43
【问题描述】:

我正在尝试以日期时间格式查找 pandas 数据框中两列之间的时间差异。

以下是我的数据框中的一些数据和我一直在使用的代码。我已经三重检查了这两列 dtypes 是 datetime64。

我的数据:

date_updated                  date_scored 
2016-03-30 08:00:00.000       2016-03-30 08:00:57.416  
2016-04-07 23:50:00.000       2016-04-07 23:50:12.036 

我的代码:

data['date_updated'] = pd.to_datetime(data['date_updated'], 
format='%Y-%m-%d %H:%M:%S')
data['date_scored'] = pd.to_datetime(data['date_scored'], 
format='%Y-%m-%d %H:%M:%S')
data['Diff'] =  data['date_updated'] - data['date_scored']

我收到的错误信息:

TypeError: data type "datetime" not understood

任何帮助将不胜感激,谢谢!

我的解决方案:

for i in raw_data[:10]:
scored = i.date_scored
scored_date =  pd.to_datetime(scored, format='%Y-%m-%d %H:%M:%S')
if type(scored_date) == "NoneType":
    pass
elif scored_date.year >= 2016:
    extracted = i.date_extracted
    extracted =  pd.to_datetime(extracted, format='%Y-%m-%d %H:%M:%S')
    bank = i.bank.name
    diff = scored - extracted
    datum = [str(bank), str(extracted), str(scored), str(diff)]
    data.append(datum)
else:
    pass

【问题讨论】:

  • 你用的是什么版本的熊猫?另外,您确定要减去单个日期吗?您的代码建议您减去 DateTimeIndex 对象,在这种情况下 data['date_updated'].difference(data['date_scored']) 会更好
  • 对我来说工作得很好......另外,我认为你不需要format 参数。 pandas 会找出这种格式。
  • 我删除了格式参数并将字符串很好地转换为日期时间格式,但是在运行包含实际减法的最后一行代码时,我仍然得到 TypeError: data type "datetime" not理解...
  • 使用代码时:data['date_updated'].difference(data['date_scored']) 我收到以下错误:AttributeError: 'Series' object has no attribute 'difference'
  • 感谢您回复我。对我来说,我必须卸载 numpy,然后使用 .whl 文件再次安装。如果他们将来看到这一点,它可能会帮助其他人。 lfd.uci.edu/~gohlke/pythonlibs

标签: python pandas datetime subtraction


【解决方案1】:

我使用上述语法遇到了同样的错误(虽然在另一台机器上工作):

data['Diff'] =  data['date_updated'] - data['date_scored']

它在我的新机器上工作:

data['Diff'] =  data['date_updated'].subtract(data['date_scored'])

【讨论】:

  • 酷,我不久前解决了这个问题 - 但我喜欢这个解决方案!
【解决方案2】:

您需要更新熊猫。 我刚刚遇到了与过去运行没有问题的旧代码相同的问题。 将 pandas (0.18.1-np111py35_0) 更新到较新版本 (0.20.2-np113py35_0) 后,问题已解决。

【讨论】:

    【解决方案3】:

    它就像一个魅力。您甚至可以简化您的代码,因为 to_datetime 足够聪明,可以为您猜出格式。

    import io
    import pandas as pd
    # Paste the text by using of triple-quotes to span String literals on multiple lines
    zz = """date_updated,date_scored
    2016-03-30 08:00:00.000,       2016-03-30 08:00:57.416  
    2016-04-07 23:50:00.000,       2016-04-07 23:50:12.036"""
    
    data = pd.read_table(io.StringIO(zz), delim_whitespace=False, delimiter=',')
    
    data['date_updated'] = pd.to_datetime(data['date_updated'])
    data['date_scored'] = pd.to_datetime(data['date_scored'])
    data['Diff'] =  data['date_updated'] - data['date_scored']
    
    print(data)
    #          date_updated             date_scored                     Diff
    # 0 2016-03-30 08:00:00 2016-03-30 08:00:57.416 -1 days +23:59:02.584000
    # 1 2016-04-07 23:50:00 2016-04-07 23:50:12.036 -1 days +23:59:47.964000
    

    【讨论】:

    • 数据从 csv 文件读入 pandas df...如何将 io 功能添加到现有 df?谢谢!
    • 您好,import io 只是在这里通过io.StringIO(zz) 读取示例数据,它与读取 CSV 文件无关。所以不要考虑它。我建议按原样尝试下面的示例。如果有效,则表示问题出在您的数据中。
    • 我遇到了与我的数据相同的错误...TypeError: data type "datetime" not理解
    • 这是我的三个“导入”: >>> 将日期时间导入为 dt >>> 将熊猫导入为 pd >>> 将 numpy 导入为 np
    • 您不需要导入datetime。但是,这并不能解释错误。我认为问题可能来自您的 python 安装,因为我提供的示例适用于 pandas。例如,尝试使用 Anaconda 发行版从全新安装开始。抱歉,我不知道如何帮助您。
    猜你喜欢
    • 2018-11-15
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2020-08-27
    • 2013-12-10
    • 2017-03-31
    相关资源
    最近更新 更多