在python中向前滚动数据,保持日期一致

2024-05-21 15:37:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组数据将保持静态。我还没有确定存储它的最佳格式,可能是数据帧,但我愿意接受建议

我的目标是向前滚动数据,因此我的静态数据集是最新的,但我需要保持日期的一致性。例如,如果我的静态数据如下所示:


         Date  Day Temp
0  01/01/2021  Fri   20
1  02/01/2021  Sat   17
2  03/01/2021  Sun   17
3  04/01/2021  Mon   16
4  05/01/2021  Tue   20
5  06/01/2021  Wed   16
6  07/01/2021  Thu   21
7  08/01/2021  Fri   19

我将拥有的最后一个数据是2021年1月8日的数据。如果我在2021年1月9日运行此数据,它将如下所示:


Date  Day Temp
0  02/01/2021  Sat   17
1  03/01/2021  Sun   17
2  04/01/2021  Mon   16
3  05/01/2021  Tue   20
4  06/01/2021  Wed   16
5  07/01/2021  Thu   21
6  08/01/2021  Fri   19
7  09/01/2021  Sat   17

2021年1月9日是星期六,因此它向前滚动了数据集中2021年1月2日最后一个星期六的数据

我无法提前确定数据集将包含多少天,我可能需要将数据向前滚动多次,例如,静态数据集中的最后一个数据可能是2018年5月15日,我需要将其滚动到今天

我已经看过了numpy roll和pandas shift,但我正在努力保持日子的一致性

出于兴趣,有可能进一步改进这一点。它没有匹配最早的一天并向前滚动,而是首先尝试将最早的数据与同一个月和同一天进行匹配,以便月温度保持一致

谢谢


Tags: 数据date格式静态sattemp一致性sun
2条回答
df['Date']=pd.to_datetime(df['Date'], format='%d/%m/%Y')+ pd.Timedelta('1 day')#Roll day forward
df['Day']=df['Date'].dt.strftime('%a')#Extract Day Name from Date
#df['Temp']=df['Temp'].shift(-1).fillna(df['Temp'].shift())#Should have been ideal?
df['Temp']=df['Temp'].shift(-1).fillna(df['Temp'].shift(5))#Fillna of the last row




    Date  Day  Temp
0 2021-01-02  Sat  17.0
1 2021-01-03  Sun  17.0
2 2021-01-04  Mon  16.0
3 2021-01-05  Tue  20.0
4 2021-01-06  Wed  16.0
5 2021-01-07  Thu  21.0
6 2021-01-08  Fri  19.0
7 2021-01-09  Sat  17.0

如果静态数据不能保证有连续的日期等,您可以使用groupby到与星期和月份的日期匹配的最后一条记录。如果没有任何数据匹配一周中的那一天,这将给出一个KeyError

这是您的初始df:

df = pd.DataFrame({'Date': {0: pd.to_datetime('2021-01-01'),
1: pd.to_datetime('2021-01-02'),
2: pd.to_datetime('2021-01-03'), 
3: pd.to_datetime('2021-01-04'),
4: pd.to_datetime('2021-01-05'),
5: pd.to_datetime('2021-01-06'),
6: pd.to_datetime('2021-01-07'),
7: pd.to_datetime('2021-01-08')},
'Day': {0: 'Fri',  1: 'Sat',  2: 'Sun', 3: 'Mon', 
         4: 'Tue', 5: 'Wed', 6: 'Thu', 7: 'Fri'},
 'Temp': {0: 20, 1: 17, 2: 17, 3: 16, 4: 20, 
          5: 16, 6: 21, 7: 19}})

如果你想推出第一张唱片,你可以用多种方法。。。这将使用shift(),尽管这将使df['Temp']列由于NaN而成为浮动列(如果这很重要的话)

df = df.shift(-1).dropna()

下一部分将从静态数据构建查找表

  • 第一个是按周中的月和日进行索引,并保留每对的最新值,我认为这就是您想要的。如果您确实想要最早的日期,只需使用first而不是last
  • 第二个lookup2会删除月份索引,并为您提供数据以获取最新的匹配日期,忽略月份

代码:

lookup = df.groupby([df['Date'].dt.month, df['Date'].dt.day_of_week]).last()
lookup2 = lookup.droplevel(0)
lookup2 = lookup2[~lookup2.index.duplicated(keep='last')]

插入记录的代码如下所示。我将其包含在一个循环中,该循环每次添加第二天,以便您可以连续添加多天来测试它:

ndays = 5
for i in range(ndays):
    next_date = df.iloc[-1]['Date'] + pd.Timedelta("1D")
    try:
        temp = lookup.loc[(next_date.month, next_date.day_of_week), 'Temp']
    except KeyError:
        temp = lookup2.loc[next_date.day_of_week, 'Temp']
    df = df.append( {'Date' : next_date, 'Day' : next_date.strftime("%a"), 'Temp' : temp}, ignore_index=True)

print(df)
         Date  Day  Temp
0  2021-01-02  Sat  17.0
1  2021-01-03  Sun  17.0
2  2021-01-04  Mon  16.0
3  2021-01-05  Tue  20.0
4  2021-01-06  Wed  16.0
5  2021-01-07  Thu  21.0
6  2021-01-08  Fri  19.0
7  2021-01-09  Sat  17.0
8  2021-01-10  Sun  17.0
9  2021-01-11  Mon  16.0
10 2021-01-12  Tue  20.0
11 2021-01-13  Wed  16.0

无论如何,希望这至少符合您的要求,并且您可以修改它以满足您的需要

相关问题 更多 >