Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 根据timeseries数据帧的时间列更正日期列中的条目_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 根据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

我有一个timeseries数据帧,它有三列。。。日期、时间和值,如下所示:

**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日。