【问题标题】:how can get difference between a defined date and the dates from a csv file python如何从 csv 文件 python 中获取定义的日期和日期之间的差异
【发布时间】:2021-10-08 12:06:03
【问题描述】:

我有一个日期列表,我想从定义的日期(我的意思是天数)中得到一个差异,并在新列中附加计算的天数

from datetime import date, datetime
import pandas as pd

df = pd.read_csv("date.csv", parse_dates = ["dates"])

#a date to substact dates in csv
defined_date = date(2020,12,25)

#a list of dates from a csv file
csv_dates = df.dates

diff = [defined_date  - csv_dates]
print(diff)

我收到TypeError: unsupported operand type(s) for -: 'DatetimeArray' and 'datetime.date'

现在如何以与定义日期相同的格式读取 csv 文件中的日期有没有办法这样做

#How to change a list of dates from a csv file to date datatype
csv_dates = df.dates

【问题讨论】:

    标签: python pandas csv dataset


    【解决方案1】:

    您正在尝试将数组与单个变量进行比较,'DatetimeArray' 表示它是 Pandas 时间戳数组。

    在一个简单的情况下,我将索引[0] 分配给csv_dates

    此时 Pandas 会给出Timestamp 对象,我们需要使用.date() 将其转换为datetime.date

    这是工作示例。

    我的 CSV 文件:

    dates
    2017/01/30
    2017/01/30
    2017/01/30
    2017/01/30
    2017/01/30
    2017/01/30
    

    第一种方法,将pandas.Timestamp 转换为datetime.date

    修改后的脚本:

    from datetime import date, datetime
    import pandas as pd
    
    df = pd.read_csv("date.csv", parse_dates = ["dates"])
    
    #a date to substact dates in csv
    defined_date = date(2020,12,25)
    
    #a list of dates from a csv file
    csv_dates = df.dates
    
    diff = [defined_date  - csv_dates[0].date()]
    print(diff)
    

    结果:

    [datetime.timedelta(days=1425)]
    

    编辑:第二种方法,将datetime.date 转换为pandas.Timestamp

    使用pd.to_datetime() 将日期时间更改为 pandas 时间戳,然后一次性完成。

    from datetime import date, datetime
    import pandas as pd
    
    df = pd.read_csv("date.csv", parse_dates = ["dates"])
    
    #a date to substact dates in csv
    defined_date = pd.to_datetime(date(2020,12,25))
    
    #a list of dates from a csv file
    csv_dates = df.dates
    
    diff = [defined_date  - csv_dates]
    print(diff)
    

    结果:

    [0   1425 days
    1   1425 days
    2   1425 days
    3   1425 days
    4   1425 days
    5   1425 days
    Name: dates, dtype: timedelta64[ns]]
    

    【讨论】:

    • 如果自 csv_dates[0].date() 以来我在 csv 文件中有多个日期系列怎么办?在 csv 文件中给出第一个日期的日期
    • 您可以使用循环遍历所有日期
    • @ubongo 这个答案可能会修复错误。但是,随着数据的增长,一次循环遍历您的数据会变得很慢。
    • @ChrisWesseling 那么最好的解决方案是什么
    • @ubongo 我不知道最好,但这更快stackoverflow.com/a/68633695/383793
    【解决方案2】:

    显示此错误是因为csv['date']defined_date 的数据类型不同。

    当您使用pd.read_csv("date.csv", parse_dates = ["dates"]) 读取_csv 文件时,日期将解析为Timestamp

    您需要使用 date() 更改 pandas 数据框中的日期类型。

    因此您可以使用以下代码:

    from datetime import date, datetime
    import pandas as pd
    
    df = pd.read_csv("date.csv", parse_dates = ["dates"])
    
    #a date to substact dates in csv
    defined_date = date(2020,12,25)
    
    #a list of dates from a csv file
    csv_dates = df.dates
    
    
    df['diff'] = [defined_date  - csv_dates.date()]
    
    

    【讨论】:

      【解决方案3】:

      这是因为您试图从defined_date 中减去数组(系列)。这不是那样的。您需要遍历您的 csv_dates 系列并向新列添加差异。

      dates_diff = []
      for d in csv_dates:
          dates_diff.append(d.date() - defined_date)
      
      df['diff'] = dates_diff
      

      【讨论】:

        【解决方案4】:

        此错误表明您正在使用不同的日期类型。

        如果你试试这个例子:

        defined_date = date(2020,12,25)
        csv_dates = date(2020,12,28)
        
        diff = defined_date - csv_dates
        print(diff)
        

        输出:

        -3 days, 0:00:00
        

        它有效。

        因此,您必须根据defined_date 格式转换您的csv['date']。(反之亦然)

        【讨论】:

          猜你喜欢
          • 2015-10-04
          • 2023-03-26
          • 2019-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-25
          • 2020-11-19
          • 2020-03-22
          相关资源
          最近更新 更多