Python 向中的df添加缺少的时间戳行

Python 向中的df添加缺少的时间戳行,python,pandas,datetime,Python,Pandas,Datetime,我有非常不寻常的时间序列数据,既不规则,又有几个缺失值。 数据点仅在工作日(上午10:00、下午2:00和下午6:00)每天测量3次,大多数天缺少一个或两个测量值,有些天完全缺少 我的df看起来像这样: date time | value 0 2020-07-30 10:00:00 5 1 2020-07-30 14:00:00 3 2 2020-07-31 10:00:00 6 3 2020

我有非常不寻常的时间序列数据,既不规则,又有几个缺失值。 数据点仅在工作日(上午10:00、下午2:00和下午6:00)每天测量3次,大多数天缺少一个或两个测量值,有些天完全缺少

我的df看起来像这样:

      date time            | value 
0     2020-07-30 10:00:00      5 
1     2020-07-30 14:00:00      3 
2     2020-07-31 10:00:00      6 
3     2020-07-31 14:00:00     4.5 
4     2020-07-31 18:00:00      7 
5     2020-08-03 14:00:00     5.5 
6     2020-08-04 14:00:00      5 
我试图找出如何用缺失测量值的时间戳来填充它,添加一行缺失时间戳和NA值,但不添加一天中的额外时间或任何周六或周日,因此我的df最后看起来像这样:

      date time            | value 
0     2020-07-30 10:00:00      5 
1     2020-07-30 14:00:00      3 
2     2020-07-30 18:00:00      NA  
3     2020-07-31 10:00:00      6 
4     2020-07-31 14:00:00     4.5  
5     2020-07-31 18:00:00      7 
6     2020-08-03 10:00:00      NA 
7     2020-08-03 14:00:00     5.5 
8     2020-08-03 18:00:00      NA
9     2020-08-04 10:00:00      NA  
10    2020-08-04 14:00:00      5 
11    2020-08-04 18:00:00      NA 
我能想到的唯一一件事是非常复杂的:写一个循环,为所需日期范围内的所有日期生成一行*3(每次测量1次),格式为日期时间,以及一个额外的星期计数器。将其转换为df,然后删除星期=6,7的所有列,然后将此新df与日期-时间列(外部或左侧-保留所有列的那一列)上的原始df进行连接

还有更优雅的方法吗

df = pd.DataFrame([
{"date time": datetime.datetime.strptime("2020-07-30 10:00:00", '%Y-%m-%d %H:%M:%S'), "value": 5},
{"date time": datetime.datetime.strptime("2020-07-30 14:00:00", '%Y-%m-%d %H:%M:%S'), "value": 3},
{"date time": datetime.datetime.strptime("2020-07-31 10:00:00", '%Y-%m-%d %H:%M:%S'), "value": 6},
{"date time": datetime.datetime.strptime("2020-07-31 14:00:00", '%Y-%m-%d %H:%M:%S'), "value": 4.5},
{"date time": datetime.datetime.strptime("2020-07-31 18:00:00", '%Y-%m-%d %H:%M:%S'), "value": 7},
{"date time": datetime.datetime.strptime("2020-08-02 14:00:00", '%Y-%m-%d %H:%M:%S'), "value": 5.5},
{"date time": datetime.datetime.strptime("2020-08-03 14:00:00", '%Y-%m-%d %H:%M:%S'), "value": 5},
    ]
)
输出:

                     value
2020-07-30 10:00:00    5.0
2020-07-30 14:00:00    3.0
2020-07-30 18:00:00    NaN
2020-07-31 10:00:00    6.0
2020-07-31 14:00:00    4.5
2020-07-31 18:00:00    7.0
2020-08-01 10:00:00    NaN
2020-08-01 14:00:00    NaN
2020-08-01 18:00:00    NaN
2020-08-02 10:00:00    NaN
2020-08-02 14:00:00    5.5
2020-08-02 18:00:00    NaN
2020-08-03 10:00:00    NaN
2020-08-03 14:00:00    5.0
2020-08-03 18:00:00    NaN
2020-08-04 10:00:00    NaN
2020-08-04 14:00:00    NaN
2020-08-04 18:00:00    NaN

您可以创建一个筛选的日期范围,并根据它建立索引:

all_ts = pd.date_range(start=df['datetime'].min(), end=df['datetime'].max(), freq='H')
weekday_ts = all_ts[~all_ts.weekday.isin([5,6])]
filtered_ts = weekday_ts[weekday_ts.hour.isin([10, 14, 18])]
df.set_index(df['datetime']).reindex(filtered_ts).drop('datetime', axis=1).reset_index()

回答得好,看来你错过了周末。哦,你说得对!我借用你答案的一部分来解决这个问题,谢谢
all_ts = pd.date_range(start=df['datetime'].min(), end=df['datetime'].max(), freq='H')
weekday_ts = all_ts[~all_ts.weekday.isin([5,6])]
filtered_ts = weekday_ts[weekday_ts.hour.isin([10, 14, 18])]
df.set_index(df['datetime']).reindex(filtered_ts).drop('datetime', axis=1).reset_index()