【发布时间】:2021-11-21 11:40:29
【问题描述】:
我的熊猫df3 看起来像这样:
df3 = pd.DataFrame([['23.02.2012', '23.02.2012', 'aaa'], ['27.02.2014', '27.02.2014', 'bbb'], ['17.08.2018', '17.08.2018', 'ccc'], ['22.07.2019', '22.07.2019', 'ddd']], columns=['date', 'period', 'text'])
如果日期对应,我想让列period 显示以下句点。由于一些 date 值是用时间戳格式化的,而有些不是,它没有创建正确的(没有时间戳)period 值。这就是为什么我做了df3['question_date'].dt.date
df3['date'] = pd.to_datetime(df3['date'], errors = 'coerce')
df3['question_date'] = df3['question_date']
df3['period'] = df3['date']
col_name = 'period'
strt_col = df3.pop(col_name)
df3.insert(5, col_name, strt_col)
date1 = pd.Timestamp('1990-10-14').date()
date2 = pd.Timestamp('1994-11-10').date()
date3 = pd.Timestamp('1999-10-1').date()
date4 = pd.Timestamp('2004-6-13').date()
date5 = pd.Timestamp('2009-8-30').date()
date6 = pd.Timestamp('2014-10-14').date()
date7 = pd.Timestamp('2019-11-26').date()
date8 = pd.Timestamp('2021-9-20').date()
mask1 = (df3['question_date'] >= 'date1') & (df3['question_date'] < 'date2')
mask2 = (df3['question_date'] >= 'date2') & (df3['question_date'] < 'date3')
mask3 = (df3['question_date'] >= 'date3') & (df3['question_date'] < 'date4')
mask4 = (df3['question_date'] >= 'date4') & (df3['question_date'] < 'date5')
mask5 = (df3['question_date'] >= 'date5') & (df3['question_date'] < 'date6')
mask6 = (df3['question_date'] >= 'date6') & (df3['question_date'] < 'date7')
mask7 = (df3['question_date'] >= 'date7') & (df3['question_date'] < 'date8')
df3.loc[mask1, 'leg_per'] = '1990-1994'
df3.loc[mask2, 'leg_per'] = '1994-1999'
df3.loc[mask3, 'leg_per'] = '1999-2004'
df3.loc[mask4, 'leg_per'] = '2004-2009'
df3.loc[mask5, 'leg_per'] = '2009-2014'
df3.loc[mask6, 'leg_per'] = '2014-2019'
df3.loc[mask7, 'leg_per'] = '2019-2021'
.
.
.
mask1 会抛出错误
TypeError: '>=' not supported between instances of 'datetime.date' and 'str'
原问题:preventing timestamp creation in to_datetime() formatting in order to group by periods
【问题讨论】:
-
df3['date']是一个日期对象,'1990-10-14'是一个字符串。您不能直接比较这两个值。转换其中一个,使它们是相同的类型。 -
错误告诉你到底哪里出了问题。您不能使用
>=运算符来比较datetime.date对象和str对象。您需要将日期转换为字符串,或将字符串转换为日期。 -
pd.to_datetime 转换为 datetime64,而不是 datetime.date - 你怎么会有那个类的实例?
-
一般来说,如果您在 pandas 中使用日期/时间,并且想为自己省点麻烦:请使用 pandas 必须提供的 datetime64 数据类型。避免使用 Python 的日期时间、日期和时间类。它会导致您遇到的问题并减少您手头的功能。
-
所以只需写
date1 = pd.Timestamp('1990-10-14')和mask1 = (df3['question_date'] >= date1) & (df3['question_date'] < date2)之类的掩码,df3['question_date']是pandas datetime64 列。
标签: python pandas datetime datetime-format python-datetime