Python根据pandas中的时间戳查找多个值

Posted

技术标签:

【中文标题】Python根据pandas中的时间戳查找多个值【英文标题】:Python lookup multiple values based on timestamp in pandas 【发布时间】:2019-02-08 22:23:43 【问题描述】:

我有一个如下所示的数据框:

d = 'from': ['apple', 'banana', 'orange', 'banana', 'apple', 'orange'],
     'to': ['banana', 'orange', 'apple', 'orange', 'banana', 'apple'],
     'month': ['Aug-18', 'Aug-18', 'Aug-18', 'Sep-18', 'Sep-18','Sep-18']

df = pd.DataFrame(data=d)

出来:

     from      to    month
0   apple  banana   Aug-18
1  banana  orange   Aug-18
2  orange   apple   Aug-18
3  banana  orange   Sep-18
4   apple  banana   Sep-18
5  orange   apple   Sep-18

我有一个 CSV 参考表/查找表,如下所示:

product  start_date  end_date   weight grade
apple    01/06/2018  31/08/2018 heavy   a
orange   01/06/2018  31/08/2018 heavy   c
banana   01/06/2018  31/08/2021 heavy   b
apple    01/09/2018  31/12/2021 small   a
orange   01/09/2018  31/12/2021 heavy   a

注意:在参考/查找中,维度可能会因月而异。

我需要在我的数据框中插入 4 个新列:(1) from_weight,(2) to_weight,(3) from_grade (4) to_grade。并根据时间戳将数据框中的值与参考表合并以获得此结果:

     from      to    month     from_weight to_weight from_grade to_grade
 0   apple  banana   Aug-18       heavy     heavy          a        b
 1  banana  orange   Aug-18       heavy     heavy          b        a
 2  orange   apple   Aug-18       heavy     heavy          a        a
 3  banana  orange   Sep-18       heavy     heavy          b        a
 4   apple  banana   Sep-18       small     heavy          a        b
 5  orange   apple   Sep-18       heavy     small          a        a

【问题讨论】:

您自己尝试过任何代码吗?你的困难是什么? 你能解释一下输出表是如何创建的吗? 我会将 csv 文件上的开始日期转换为与您的数据框中类似的格式,并尝试合并两次,一次用于“从”和“开始日期”,然后用于“到”和结束日期。相反,如果您的数据很小,您可以编写一个循环来查找 csv 文件中的相应值。 您的语言环境是什么? Sept 不是九月的标准缩写。 我的困难是我不知道从哪里开始。输出表应在我的数据框中插入 4 个新列,然后使用基于相关月份的参考表中的值填充这些列。例如,对于 'apples' 在 8 月返回 weight=heavy 对于 'apples' 在 9 月 weight=small 【参考方案1】:

希望这涵盖了所有情况,但仅凭提供的示例无法完全确定。我想“CSV 参考”总是在每月的第一天/最后一天开始/结束(否则你必须告诉我们如何处理这些情况)。

grade.csv:

product,start_date,end_date,weight,grade
apple,01/06/2018,31/08/2018,heavy,a
orange,01/06/2018,31/08/2021,heavy,c
banana,01/06/2018,31/08/2021,heavy,b
apple,01/09/2018,01/01/2021,small,a
orange,01/06/2018,31/08/2021,heavy,a

解决方案:

import pandas as pd
from dateutil import parser
import datetime as dt

d = 'from': ['apple', 'banana', 'orange', 'banana', 'apple', 'orange'],
     'to': ['banana', 'orange', 'apple', 'orange', 'banana', 'apple'],
     'month': ['Aug-18', 'Aug-18', 'Aug-18', 'Sept-18', 'Sept-18','Sept-18']

df = pd.DataFrame(data=d, columns=list(d.keys()) + ['from_weight', 'to_weight', 'from_grade', 'to_grade'])

grade = pd.read_csv('grade.csv')

for entry in df.index:
     date = parser.parse(df.loc[entry, 'month'])
     for line in grade.index:
          date_start = dt.datetime.strptime(grade.loc[line, 'start_date'], '%d/%m/%Y')
          date_end = dt.datetime.strptime(grade.loc[line, 'end_date'], '%d/%m/%Y')
          if (df.loc[entry, 'from'] == grade.loc[line, 'product']) & (date > date_start) & (date < date_end):
               df.loc[entry, 'from_weight'] = grade.loc[line, 'weight']
               df.loc[entry, 'from_grade'] = grade.loc[line, 'grade']

          if (df.loc[entry, 'to'] == grade.loc[line, 'product']) & (date > date_start) & (date < date_end):
               df.loc[entry, 'to_weight'] = grade.loc[line, 'weight']
               df.loc[entry, 'to_grade'] = grade.loc[line, 'grade']


print(df)

输出:

from      to    month from_weight to_weight from_grade to_grade
0   apple  banana   Aug-18       heavy     heavy          a        b
1  banana  orange   Aug-18       heavy     heavy          b        a
2  orange   apple   Aug-18       heavy     heavy          a        a
3  banana  orange  Sept-18       heavy     heavy          b        a
4   apple  banana  Sept-18       small     heavy          a        b
5  orange   apple  Sept-18       heavy     small          a        a

【讨论】:

是的,它应该始终是该月的最后一天。我如何添加这个:df = pd.DataFrame(data=d, columns=list(d.keys()) + ['from_weight', 'to_weight', 'from_grade', 'to_grade']) 当我使用时:df = pd.read_csv('C:\example.csv', usecols= ['from','to', 'month']) @thor 如果您使用df = pd.read_csv('C:\example.csv', usecols= ['from','to', 'month']),我编写的代码也可以使用,当您第一次尝试使用它时,新列将自动添加到数据框中。唯一的区别是我们列的顺序会有所不同。请接受我的回答,谢谢。

以上是关于Python根据pandas中的时间戳查找多个值的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 时间戳字符串转换为 pandas 数据框中的 python 日期

Python Pandas根据多个其他列中的条件替换一列中的值[重复]

使用 Panda 在 Python 中根据名称查找值之间的关系

如何根据 SQL 中的时间戳查找特定事件的下一个序列?

Pandas 将多个数据帧与时间戳索引对齐

根据python中训练和测试集中的时间戳为每个用户拆分数据集