Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在给定值的50天内绘制日期值为的行(以大熊猫为单位)_Python_Date_Pandas_Matplotlib_Graph - Fatal编程技术网

Python 在给定值的50天内绘制日期值为的行(以大熊猫为单位)

Python 在给定值的50天内绘制日期值为的行(以大熊猫为单位),python,date,pandas,matplotlib,graph,Python,Date,Pandas,Matplotlib,Graph,我有一个DataFrame(dataframeA),其中包含一列日期,格式如下 日期 19960826 19960826 19970303 19970320 19970905 和一列值 值 100 35 11 37 和一列组 groupK groupL groupM 给定另一个数据帧dataframeB,它有两列:格式为yyyymmdd的日期和组。对于dataframeB中的每一行,如何绘制每个组日期前后60天内的值 i、 e.如果dataframeB第一行是 20050101集团M 图(Y

我有一个DataFrame(dataframeA),其中包含一列日期,格式如下

日期
19960826
19960826
19970303
19970320
19970905

和一列值

100
35
11
37

和一列组
groupK
groupL
groupM

给定另一个数据帧dataframeB,它有两列:格式为yyyymmdd的日期和组。对于dataframeB中的每一行,如何绘制每个组日期前后60天内的值

i、 e.如果dataframeB第一行是
20050101集团M


图(Y轴上)dataframeA中的值,其中日期在2005年1月1日之前或之后的50天内,组为groupM。

以下是一些示例数据:

import pandas as pd
import numpy as np
import string

start_date = '20050101'
drange = pd.date_range(start_date, periods=100, freq='D')
possible_groups = ['A','B','C','D','E','F']
chosen = np.random.choice(possible_groups, len(drange), replace=True)
groups = pd.Series(chosen).apply(lambda x: 'group'+x)
values = np.random.randint(1, 100, len(drange))

dfA = pd.DataFrame({'date':drange, 'grp':groups, 'value':values})
dfB = pd.DataFrame({'date':drange, 'grp':groups})
注意:如果需要使datetime对象看起来像
YYYYMMDD
,可以使用
strftime()
并根据需要切换回datetime,例如:

drange = pd.date_range(start_date, periods=100, freq='D').strftime('%Y%m%d')
现在,假设出于某种原因需要将这些数据帧分开(即不允许使用
merge()
),下面的方法应该可以工作

def plot_range(data, within):
    (
     dfA.set_index('date')
        .loc[dfA.grp.values == data.grp]
        .loc[data.date-pd.Timedelta(days=within):
             data.date+pd.Timedelta(days=within)]
        .plot(title=data.grp)
    )

within = 50 # set within to the desired range in days around a date
dfB.apply(plot_range, axis='columns', args=(within,))
以下是几天子集的输出示例:

subset = 3
within = 10
dfB.sample(subset).apply(plot_range, axis='columns', args=(within,))  

使用样本数据会更好。否则,我就不会浪费时间去编一个例子了。那就是我。其他人可能愿意帮忙。为了帮助您最大限度地获得问题的答案、阅读和@Pirsquare,我明白没有所有的数据会使问题变得更加困难,我一直在尽可能地减少问题的发生。即使理解如何在给定日期的范围内获取行,也会非常有帮助。我能理解图形和迭代,但我真的很难理解。