python - 如何使用 Pandas 将所有整天的每日数据重新采样为每小时数据?

标签 python pandas datetime

我有一个像下面这样的数据框 df:

    city    datetime    value
0   city_a  2020-07-10  2
1   city_a  2020-07-11  5
2   city_b  2020-07-11  4
我正在尝试以 6 小时的频率(每 00 小时、6 小时、12 小时和 18 小时的数据)重新采样每日日期时间。
下面的代码给了我几乎我期望的输出
my_df = my_df.set_index(['datetime', 'city'])
my_df = my_df.unstack(-1).resample('6H').pad()
my_df = my_df.stack().reset_index()
my_df = my_df[['city', 'datetime', 'value']]
my_df = my_df.sort_values(['city', 'datetime'])
输出:
    city    datetime            value
0   city_a  2020-07-10 00:00:00 2.0
1   city_a  2020-07-10 06:00:00 2.0
2   city_a  2020-07-10 12:00:00 2.0
3   city_a  2020-07-10 18:00:00 2.0
4   city_a  2020-07-11 00:00:00 5.0
5   city_b  2020-07-11 00:00:00 4.0
但是,我们可以看到 2020-07-11 的那一天并不完整。我希望包括 2020-07-11 06:00:00、12:00:00 和 18:00:00 在内的行出现在输出中。
所以我的预期输出应该是:
    city    datetime            value
0   city_a  2020-07-10 00:00:00 2.0
1   city_a  2020-07-10 06:00:00 2.0
2   city_a  2020-07-10 12:00:00 2.0
3   city_a  2020-07-10 18:00:00 2.0
4   city_a  2020-07-11 00:00:00 5.0
6   city_a  2020-07-11 06:00:00 5.0
8   city_a  2020-07-11 12:00:00 5.0
10  city_a  2020-07-11 18:00:00 5.0
5   city_b  2020-07-11 00:00:00 4.0
7   city_b  2020-07-11 06:00:00 4.0
9   city_b  2020-07-11 12:00:00 4.0
11  city_b  2020-07-11 18:00:00 4.0
有没有一种优雅的方法可以用 Pandas 做到这一点?

生成数据帧的代码:
my_df = pd.DataFrame(data = {
    'city': ['city_a', 'city_a', 'city_b'],
    'datetime': 
[pd.to_datetime('2020/07/10'),pd.to_datetime('2020/07/11'),pd.to_datetime('2020/07/11')],
    'value': [2,5,4]
})

最佳答案

使用 :

# STEP A
df1 = (df.groupby('city')['datetime'].max() + pd.Timedelta(days=1)).reset_index()

# STEP B
df1 = pd.concat([df, df1]).set_index('datetime')

# STEP C
df1 = df1.groupby('city', as_index=False).resample('6H').ffill()

# STEP D
df1 = df1.reset_index().drop('level_0', 1).dropna(subset=['value'])
详情:
步骤 A:使用 DataFrame.groupby city 上的数据框进行分组确定每组中日期的最大值并添加 1 day到每个组的最大值,这将需要重新采样数据帧。
# print(df1)
     city   datetime
0  city_a 2020-07-12
1  city_b 2020-07-12
步骤 B:使用 pd.concat 连接原始数据帧 df到新创建的数据框 df1 ,这是因为我们必须在步骤 C 中重新采样数据帧。
# print(df1)
              city  value
datetime                 
2020-07-10  city_a    2.0
2020-07-11  city_a    5.0
2020-07-11  city_b    4.0
2020-07-12  city_a    NaN
2020-07-12  city_b    NaN
步骤 C:使用 DataFrame.resample 重新采样分组在 city 上的数据帧频率为 6H并使用 ffill向前填充值。
# print(df1)
                         city  value
  datetime                          
0 2020-07-10 00:00:00  city_a    2.0
  2020-07-10 06:00:00  city_a    2.0
  2020-07-10 12:00:00  city_a    2.0
  2020-07-10 18:00:00  city_a    2.0
  2020-07-11 00:00:00  city_a    5.0
  2020-07-11 06:00:00  city_a    5.0
  2020-07-11 12:00:00  city_a    5.0
  2020-07-11 18:00:00  city_a    5.0
  2020-07-12 00:00:00  city_a    NaN
1 2020-07-11 00:00:00  city_b    4.0
  2020-07-11 06:00:00  city_b    4.0
  2020-07-11 12:00:00  city_b    4.0
  2020-07-11 18:00:00  city_b    4.0
  2020-07-12 00:00:00  city_b    NaN
步骤 D:最后使用 DataFrame.reset_index 并使用 DataFrame.drop 删除未使用的列沿axis=1 , 也使用 DataFrame.dropna NaN 删除行列中的值 value .
# print(df1)
              datetime    city  value
0  2020-07-10 00:00:00  city_a    2.0
1  2020-07-10 06:00:00  city_a    2.0
2  2020-07-10 12:00:00  city_a    2.0
3  2020-07-10 18:00:00  city_a    2.0
4  2020-07-11 00:00:00  city_a    5.0
5  2020-07-11 06:00:00  city_a    5.0
6  2020-07-11 12:00:00  city_a    5.0
7  2020-07-11 18:00:00  city_a    5.0
9  2020-07-11 00:00:00  city_b    4.0
10 2020-07-11 06:00:00  city_b    4.0
11 2020-07-11 12:00:00  city_b    4.0
12 2020-07-11 18:00:00  city_b    4.0

关于python - 如何使用 Pandas 将所有整天的每日数据重新采样为每小时数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62829918/

相关文章:

python - 对 Pandas DataFrame 中的部分字符串(关键字)匹配求和

python - 如何用numpy删除数组

python - python 中的 stdtr 在进行 t 检验时为 p 值提供 nan

python - GSuite API 访问 : Client is unauthorized to retrieve access tokens using this method

来自 Date() 对象的 javascript 格式化时间

java - 解析 "1/1/00"为 java 中的 "mm/dd/yy"格式给出 1/1/0001。如何解决?

javascript - 如何在 9 :00 AM to 10:00 AM using Javascript? 之间运行代码

python - 使用 python 代码模块时是否有一个我不知道的返回的空函数?

python - 第一行数据已成为 Pandas 表中的一列

python - 返回包含字符串内容的行,其中不包含超过特定最大长度的单词,同时保留和过滤掉包含特定内容的单词