从仅包含小时的字符串列表中在pandas框架列中设置日期



我想知道是否有人可以帮助我解决这个问题:我有一个熊猫数据框架(从文本文件生成),应该有一个类似于这个结构:

import pandas as pd
data = {'Objtype'   : ['bias', 'bias', 'flat', 'flat', 'StdStar', 'flat', 'Arc', 'Target1', 'Arc', 'Flat', 'Flat', 'Flat', 'bias', 'bias'], 
        'UT'        :  pd.date_range("23:00", "00:05", freq="5min").values,
        'Position'  : ['P0', 'P0', 'P0', 'P0', 'P1', 'P1','P1', 'P2','P2','P2', 'P0', 'P0', 'P0', 'P0']}
df   = pd.DataFrame(data=data)

我想做一些操作,考虑到观察的时间,所以我将UT列从string格式更改为numpy datetime64:

df['UT'] = pd.to_datetime(df['UT'])

结果是这样的:

   Objtype Position                  UT
0     bias       P0 2016-08-31 23:45:00
1     bias       P0 2016-08-31 23:50:00
2     flat       P0 2016-08-31 23:55:00
3     flat       P0 2016-08-31 00:00:00
4  StdStar       P1 2016-08-31 00:05:00
5     flat       P1 2016-08-31 00:10:00
6      Arc       P1 2016-08-31 00:15:00
7  Target1       P1 2016-08-31 00:20:00

然而,这里有两个问题:

首先)将年/月/日分配给当前的。

第二)天没有从23:59 -> 00:00改变。相反,它倒退了。

如果我们知道第一个数据帧索引行的真实日期,并且我们知道所有条目都是顺序的(并且它们总是从日落到日出)。我们如何纠正这些问题?

查找两行之间的时间差:

df.UT - df.UT.shift()
Out[48]: 
0                 NaT
1            00:05:00
2            00:05:00
3   -1 days +00:05:00
4            00:05:00
5            00:05:00
6            00:05:00
7            00:05:00
Name: UT, dtype: timedelta64[ns]

查找时间倒流的时间:

df.UT - df.UT.shift() < pd.Timedelta(0)
Out[49]: 
0    False
1    False
2    False
3     True
4    False
5    False
6    False
7    False
Name: UT, dtype: bool

为每一行增加1天的时间:

((df.UT - df.UT.shift() < pd.Timedelta(0))*pd.Timedelta(1, 'D'))
Out[50]: 
0   0 days
1   0 days
2   0 days
3   1 days
4   0 days
5   0 days
6   0 days
7   0 days
Name: UT, dtype: timedelta64[ns]

使用cumsum模式转发序列中的额外天数:

((df.UT - df.UT.shift() < pd.Timedelta(0))*pd.Timedelta(1, 'D')).cumsum()
Out[53]: 
0   0 days
1   0 days
2   0 days
3   1 days
4   1 days
5   1 days
6   1 days
7   1 days
Name: UT, dtype: timedelta64[ns]

将此修正向量添加回原始UT列:

df.UT + ((df.UT - df.UT.shift() < pd.Timedelta(0))*pd.Timedelta(1, 'D')).cumsum()
Out[51]: 
0   2016-08-31 23:45:00
1   2016-08-31 23:50:00
2   2016-08-31 23:55:00
3   2016-09-01 00:00:00
4   2016-09-01 00:05:00
5   2016-09-01 00:10:00
6   2016-09-01 00:15:00
7   2016-09-01 00:20:00
Name: UT, dtype: datetime64[ns]

最新更新