Python 根据timeseries数据帧的时间列更正日期列中的条目
我有一个timeseries数据帧,它有三列。。。日期、时间和值,如下所示:Python 根据timeseries数据帧的时间列更正日期列中的条目,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个timeseries数据帧,它有三列。。。日期、时间和值,如下所示: **date** **time** **value** 11.03.2020 1103 5 11.03.2020 0000 10 11.03.2020 0100 6 12.03.2020
**date** **time** **value**
11.03.2020 1103 5
11.03.2020 0000 10
11.03.2020 0100 6
12.03.2020 0201 8
12.03.2020 0305 7
12.03.2020 0400 4
**date** **time** **value**
11.03.2020 1103 5
12.03.2020 0000 10
12.03.2020 0100 6
12.03.2020 0201 8
12.03.2020 0305 7
12.03.2020 0400 4
基本上,时间列每行递增60(+-5)分钟。我希望以这样的方式更正我的日期列值:每当时间为0000(+-5)时,日期列的日期部分增加1,直到遇到下一个0000(+-5)时间值,然后再次增加1,直到遇到下一个这样的时间值或到达数据帧的结尾
结果应该如下所示:
**date** **time** **value**
11.03.2020 1103 5
11.03.2020 0000 10
11.03.2020 0100 6
12.03.2020 0201 8
12.03.2020 0305 7
12.03.2020 0400 4
**date** **time** **value**
11.03.2020 1103 5
12.03.2020 0000 10
12.03.2020 0100 6
12.03.2020 0201 8
12.03.2020 0305 7
12.03.2020 0400 4
我希望能得到一些帮助。谢谢将列
date
中的字符串解析为datetime
df['date'] = pd.to_datetime(df['date'], dayfirst=True)
通过比较time
列与0000
列,使用布尔索引,将1天的DateOffset
添加到布尔掩码为真的日期列中的值,创建一个布尔掩码m
,然后mask
和forward fill
更新日期列中当前日期小于前一日期的值
m = df['time'].eq('0000')
df.loc[m, 'date'] += pd.DateOffset(days=1)
df['date'] = df['date'].mask(df['date'].diff().dt.days.lt(0)).ffill()
注意:此答案适用于样本数据,但无法正确处理月末转换。有些部分可能对参考有用,但请使用Shubham的答案进行适当的实现
假设第一天是正确的,找到接近午夜的行,cumsum()
它们并添加第一天:
df.date=pd.to_datetime(df.date,dayfirst=True)
午夜=[np.R2355:2360,0:6]]
days=(df.time.isin(midnight).cumsum()#查找midnight和cumsum的+5行
.add(df.date[0].day))#将第一天添加到cumsum系列中
# 0 11
# 1 12
# 2 12
# 3 12
# 4 12
# 5 12
#名称:时间,数据类型:int64
然后使用这些固定的天
重新构建日期
:
df.date=pd.to\u datetime(
df.date.dt.year.aType(str)
+df.date.dt.month.astype(str.str.zfill)(2)
+days.astype(str.str.zfill(2))
#日期时间值
# 0 2020-03-11 1103 5
# 1 2020-03-12 0000 10
# 2 2020-03-12 0100 6
# 3 2020-03-12 0201 8
# 4 2020-03-12 0305 7
# 5 2020-03-12 0400 4
very nice+1,使用DateOffset(days=1)
自动正确处理月末转换感谢@tdy,这是因为DateOffset
尊重日历算法:)感谢@Shubam,效果很好。你的解决方案让我想了解更多。@t我也喜欢你的解决方案,而且它很有效,不应该删除它。@MuhammadAliZia谢谢,我已经取消了删除,只是添加了一个很好的答案。继续。@tdy谢谢你回复你的答案,你能详细说明月底的交易吗?我不太明白那个部分。在我的真实数据(非常混乱)中,您的代码工作得更好。“我在试着理解我应该改进什么。”阿泽。啊,有意思,我猜你的真实数据不包含月底的日期。例如,如果将示例日期更改为2020年3月31日和2020年4月1日,我的答案将在尝试创建32.03时抛出错误,而Shubham的答案将正确换行到2020年4月1日。