【问题标题】:Convert from a list of datetime to a date in Python to filter a dataframe从日期时间列表转换为 Python 中的日期以过滤数据框
【发布时间】:2019-04-04 19:29:20
【问题描述】:

我有下一个约会:

0   2019-06-29
Name: end date, dtype: datetime64[ns]

这是名为 data 的数据框的一部分:

 data
    PointAlias       start Date    end date
 0   AO122732        2018-06-29    2019-06-29

然后我用下一个代码对其进行转换:

end_date_transformed = []
for x in range(len(data['end date'])):
    transf = pd.to_datetime(data['end date'][x]).date()
    end_date_transformed.append(transf)
end_date_transformed
output: [datetime.date(2019, 6, 29)]

我想知道是否可以将其从列表转换为字符串以应用datetime.datetime.strftime(end_date_transformed, %Y%m%d')。 有没有办法做到这一点? 这样做的最终目标是能够过滤日期数据框以获取那些日期为<= end_date_transformed 的日期。比如:

df
     date
0   2018-06-29
1   2018-10-29
2   2019-02-28
3   2019-06-29
4   2019-10-29
5   2020-02-29

df[df['date'] <= end_date_transformed] # This does not work, the output is:
ValueError: Arrays were different lengths: 44 vs 1

我知道上面的代码不起作用,但是如果我执行 datetime.date(year,month,day) 并像end_date_transformed 一样使用它,它可以工作,所以问题在于结束日期的转换。 如果有人可以提供帮助,我将不胜感激。 非常感谢您花时间阅读并回答。

【问题讨论】:

  • 你为什么首先将其存储为列表?
  • 使其对 python 可读。但我不知道这是否是正确的方法,因为我是新的@rahlf23
  • 换句话说,你只会有一个结束日期吗?还是您打算有多个结束日期?
  • @rahlf23 不止一次约会。
  • 好的,那么其他的结束日期在哪里?你能发布你的原始数据框吗?您的问题令人困惑,因为您似乎有多个数据框浮动。

标签: python pandas datetime dataframe filter


【解决方案1】:

这应该适用于您的单一结束日期:

import pandas as pd
from datetime import datetime

data = pd.DataFrame([['A0122732','2018-06-29','2019-06-29']], columns=['PointAlias','start date','end date'])

df = pd.DataFrame([
['2018-06-29'],
['2018-10-29'],
['2019-02-28'],
['2019-06-29'],
['2019-10-29'],
['2020-02-29']],
columns=['date'])

df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

end_date = datetime.strptime(data['end date'].values[0], '%Y-%m-%d')

df[df['date'] <= end_date]

返回:

        date
0 2018-06-29
1 2018-10-29
2 2019-02-28
3 2019-06-29

【讨论】:

  • 当我运行end_date = datetime.strptime(data['end date'].values[0], '%Y-%m-%d') 时出现此错误:TypeError: strptime() argument 1 must be str, not numpy.datetime64。其他部分工作完美
  • 您的data['end date'] 列似乎已经是datetime 类型,因此您无需执行转换。相反,您应该能够直接调用 df[df['date'] &lt;= data['end_date'].values[0]] 并忽略我的答案中定义 end_date 的行
  • 效果很好。非常感谢你所做的一切
  • 你打赌,很高兴我能帮上忙!
猜你喜欢
  • 2021-11-23
  • 2017-05-14
  • 2022-01-19
  • 2018-06-17
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多