我有一个日期列表,我想从定义的日期(我的意思是天)中获得一个差值,并附加在新列中计算的天数
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
这是因为您试图从defined_date
中减去数组(系列)。这是行不通的。您需要遍历csv_dates
系列,并向新列添加差异。
dates_diff = []
for d in csv_dates:
dates_diff.append(d.date() - defined_date)
df['diff'] = dates_diff
您正在尝试比较单个变量的数组,'DatetimeArray'
意味着它是一个Pandas时间戳数组。
在一个简单的情况下,我将索引[0]
分配给csv_dates
。
Timestamp
对象,我们需要使用.date()
将其转换为datetime.date
下面是工作示例。
My CSV file:
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()
将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['date']
和defined_date
的数据类型不同。
当您使用pd.read_csv("date.csv", parse_dates = ["dates"])
读取csv文件时,日期将解析为Timestamp
。
您需要使用date()
更改pandas dataframe中的日期类型。
因此可以使用以下代码:
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()]
这个错误告诉您正在使用不同的日期类型。
如果你尝试这个例子:
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']
。(或反之亦然)