我正在尝试比较两个日期,但出现错误“只能比较标记相同的Series对象” 我也尝试使用iloc和.values,因为使用此方法可以回答其他一些问题,但是使用该方法我会遇到其他各种错误。 我不确定该怎么办。问题是我写的地方:
elif group[1]["dtstart"] <= endDate
下面是我的完整示例代码。
请注意,这不是我正在使用的实际数据,因此我试图使其非常相似。两者仍然会出现相同的错误(只能比较标记相同的Series对象),
但是,当我在本节中将此代码(带有假数据)中包括.value时,group[1]["dtstart"] <= endDate.values
会出现错误:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
当我在我得到的是真实数据错误:“长度必须匹配才能进行比较”
这就是为什么我尝试iloc但仍然没有成功的原因。我什至不确定是否要使用iloc或.values,并且当我包含其中的任何一个时,伪数据和真实数据不会产生相同的错误,但是仅保留所有内容,则在伪数据和真实数据中都会产生相同的错误真实的是
“只能比较标记相同的Series对象”
感谢您的帮助。谢谢!
import pandas as pd
from datetime import datetime
import numpy as np
pd.set_option('display.max_columns', None)
#Create a DataFrame
d = {
'ID':[1,2,3,3,1,1,2,2,4,4],
'dtstart':[pd.Timestamp('2018-01-01'), pd.Timestamp('2018-01-30'), pd.Timestamp('2018-03-01'), pd.Timestamp('2018-03-14'),
pd.Timestamp('2018-04-08'), pd.Timestamp('2018-04-27'), pd.Timestamp('2018-07-03'), pd.Timestamp('2018-07-17'),pd.Timestamp('2018-07-17'),pd.Timestamp('2018-01-20')],
'dtend':[pd.Timestamp('2018-01-06'), pd.Timestamp('2018-02-15'), pd.Timestamp('2018-03-05'), pd.Timestamp('2018-03-22'),
pd.Timestamp('2018-04-15'), pd.Timestamp('2018-05-06'), pd.Timestamp('2018-07-07'), pd.Timestamp('2018-07-28'),pd.Timestamp('2018-01-18'),pd.Timestamp('2018-01-22')]}
df = pd.DataFrame(d)
grouped = df.groupby(['ID'])
grouped.apply(lambda _df: _df.sort_values(by=['dtstart']))
count=0
df_CE = pd.DataFrame(columns=['ID', 'dtstart', 'dtEnd'])
for group in grouped:
months_enrolled=len(group)
if count == 0:
print("group[1][dtstart]===",group[1]["dtstart"])
startDate = group[1]["dtstart"]
endDate = group[1]["dtend"]
count += 1
# print("endDate==",TEST_endDate.dtypes)
elif group[1]["dtstart"] <= endDate:
print("yes")
答案 0 :(得分:1)
您从未将grouped.apply(lambda _df: _df.sort_values(by=['dtstart']))
设置为任何值。如果您想对其进行排序并保持其排序,则应将其更改为
grouped = grouped.apply(lambda _df: _df.sort_values(by=['dtstart']))
这使grouped
成为多索引的DataFrame,因此您需要如此进行迭代。假设您不想这样做,则会因为比较两个长度不同的pd.Series
而收到错误消息。我运行了您的代码,并在出现错误的行中对
(4, ID dtend dtstart
8 4 2018-01-18 2018-07-17
9 4 2018-01-22 2018-01-20)
>>> g2
(2, ID dtend dtstart
1 2 2018-02-15 2018-01-30
6 2 2018-07-07 2018-07-03
7 2 2018-07-28 2018-07-17)