Pandas 日期时间过滤器
Pandas datetime filter
如果日期早于 2022 年 4 月 22 日,我想获取数据框的子集。原来的df如下
df:
date hour value
0 2022-04-21 0 10
1 2022-04-21 1 12
2 2022-04-21 2 14
3 2022-04-23 0 10
4 2022-04-23 1 12
5 2022-04-23 2 14
我通过 df.dtypes 检查了数据类型,它告诉我 'date' 列是 'object'.
所以我使用 df['date'][0] 检查了单个单元格,它是 datetime.date(2022, 4, 21).
此外,df['date'][0] < datetime.date(2022, 4, 22) 给了我 'True'
但是,当我想通过
应用比整个数据帧更小的数据时
df2 = df[df['date'] < datetime.date(2022, 4, 22)],
它显示 TypeError: '<' not supported between instances of 'str' and 'datetime.date'
为什么会这样?提前致谢!
您的某一行中很可能仍有一些字符串日期,因此第一个元素可能没问题,但使用“<”对所有值进行完整比较将失败。
要么在评论中使用timegeb的答案。
df['date'] = pd.to_datetime(df['date'])
或者按元素转换它们
import datetime
df['date']=[datetime.datetime.strptime(d,'%Y-%m-%d') if type(d)==str else d for d in test]
如果您的任何行中有奇数字符串,这两种方法都可能失败。在这种情况下,您可以使用:
def convstr2date(d):
if type(d)==str:
try:
d = datetime.datetime.strptime(str(d),'%Y-%m-%d')
except:
d = np.datetime64('NaT')
return d
df['date'] = [convstr2date(d) for d in df['date']]
如果日期早于 2022 年 4 月 22 日,我想获取数据框的子集。原来的df如下
df:
date hour value
0 2022-04-21 0 10
1 2022-04-21 1 12
2 2022-04-21 2 14
3 2022-04-23 0 10
4 2022-04-23 1 12
5 2022-04-23 2 14
我通过 df.dtypes 检查了数据类型,它告诉我 'date' 列是 'object'.
所以我使用 df['date'][0] 检查了单个单元格,它是 datetime.date(2022, 4, 21).
此外,df['date'][0] < datetime.date(2022, 4, 22) 给了我 'True'
但是,当我想通过
应用比整个数据帧更小的数据时df2 = df[df['date'] < datetime.date(2022, 4, 22)],
它显示 TypeError: '<' not supported between instances of 'str' and 'datetime.date'
为什么会这样?提前致谢!
您的某一行中很可能仍有一些字符串日期,因此第一个元素可能没问题,但使用“<”对所有值进行完整比较将失败。
要么在评论中使用timegeb的答案。
df['date'] = pd.to_datetime(df['date'])
或者按元素转换它们
import datetime
df['date']=[datetime.datetime.strptime(d,'%Y-%m-%d') if type(d)==str else d for d in test]
如果您的任何行中有奇数字符串,这两种方法都可能失败。在这种情况下,您可以使用:
def convstr2date(d):
if type(d)==str:
try:
d = datetime.datetime.strptime(str(d),'%Y-%m-%d')
except:
d = np.datetime64('NaT')
return d
df['date'] = [convstr2date(d) for d in df['date']]