Pandas DataFrame:将数据扩展到整个月

问题描述 投票:1回答:1

我获得了每月时间跟踪预订的数据。由于没有周末和国定假日的预订,因此某些天缺少数据。现在,我正在扩展数据,以使其包括该月的所有天,但仅包含空数据。这是我解决的方法。我想知道是否有更优雅的方法来实现相同的目的?

为列start索引的样本输入数据:

+---------------------+--------+-------+----------+-----------------+---------+
| start               | from   | to    | paused   |   hours_working |   error |
|---------------------+--------+-------+----------+-----------------+---------|
| 2019-11-04 00:00:00 | 08:30  | 18:00 | 00:30    |               9 |       0 |
| 2019-11-05 00:00:00 | 09:30  | 19:00 | 00:30    |               9 |       0 |
| 2019-11-06 00:00:00 | 09:00  | 18:00 | 01:00    |               8 |       0 |
+---------------------+--------+-------+----------+-----------------+---------+

然后,我将获取第一个时间戳,然后将其用于创建整个月的期间/索引:

# get first day of the month
first_timestamp = df.index[0].replace(day=1).strftime("%Y-%m-%d")

# build an index containing all days of that month
index_month = pd.date_range(start=first_timestamp, periods=pd.Period(first_timestamp).days_in_month, freq="24H")
index_month

结果:

DatetimeIndex(['2019-11-01', '2019-11-02', '2019-11-03', '2019-11-04',
               '2019-11-05', '2019-11-06', '2019-11-07', '2019-11-08',
               '2019-11-09', '2019-11-10', '2019-11-11', '2019-11-12',
               '2019-11-13', '2019-11-14', '2019-11-15', '2019-11-16',
               '2019-11-17', '2019-11-18', '2019-11-19', '2019-11-20',
               '2019-11-21', '2019-11-22', '2019-11-23', '2019-11-24',
               '2019-11-25', '2019-11-26', '2019-11-27', '2019-11-28',
               '2019-11-29', '2019-11-30'],
              dtype='datetime64[ns]', freq='24H')

很遗憾,我无法弄清楚如何将索引(日期范围)与原始数据结合在一起。因此,我必须使用新索引创建一个新的空数据框,并将该数据框与原始数据连接起来。

df_index = pd.DataFrame(index_month, columns=['start'])
df_index.set_index('start', inplace=True)

df_month = df_index.join(df).reset_index()

from tabulate import tabulate
print(tabulate(df_month, headers='keys', tablefmt='psql'))

给我最终结果:

+----+---------------------+--------+-------+----------+-----------------+---------+
|    | start               | from   | to    | paused   |   hours_working |   error |
|----+---------------------+--------+-------+----------+-----------------+---------|
|  0 | 2019-11-01 00:00:00 | nan    | nan   | nan      |             nan |     nan |
|  1 | 2019-11-02 00:00:00 | nan    | nan   | nan      |             nan |     nan |
|  2 | 2019-11-03 00:00:00 | nan    | nan   | nan      |             nan |     nan |
|  3 | 2019-11-04 00:00:00 | 08:30  | 18:00 | 00:30    |               9 |       0 |
|  4 | 2019-11-05 00:00:00 | 09:30  | 19:00 | 00:30    |               9 |       0 |
|  5 | 2019-11-06 00:00:00 | 09:00  | 18:00 | 01:00    |               8 |       0 |
|  6 | 2019-11-07 00:00:00 | nan    | nan   | nan      |             nan |     nan |
|  7 | 2019-11-08 00:00:00 | nan    | nan   | nan      |             nan |     nan |
|  8 | 2019-11-09 00:00:00 | nan    | nan   | nan      |             nan |     nan |
|  9 | 2019-11-10 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 10 | 2019-11-11 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 11 | 2019-11-12 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 12 | 2019-11-13 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 13 | 2019-11-14 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 14 | 2019-11-15 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 15 | 2019-11-16 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 16 | 2019-11-17 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 17 | 2019-11-18 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 18 | 2019-11-19 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 19 | 2019-11-20 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 20 | 2019-11-21 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 21 | 2019-11-22 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 22 | 2019-11-23 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 23 | 2019-11-24 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 24 | 2019-11-25 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 25 | 2019-11-26 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 26 | 2019-11-27 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 27 | 2019-11-28 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 28 | 2019-11-29 00:00:00 | nan    | nan   | nan      |             nan |     nan |
| 29 | 2019-11-30 00:00:00 | nan    | nan   | nan      |             nan |     nan |
+----+---------------------+--------+-------+----------+-----------------+---------+

所以,那怎么了?没什么,结果很好。但是我想知道是否有更好的方法来创建该月的索引,然后如何将该索引与原始数据结合起来?有什么建议么?只是想学习并变得更好;)

python pandas dataframe indexing date-range
1个回答
4
投票

如果DatetimeIndex的所有值都是唯一的,则可以在此处使用DataFrame.reindex-同样,对于新的DataFrame.reindex的开始和结束,首先将第一个值转换为月份期间,然后使用DatetimeIndex

Period.to_timestamp
© www.soinside.com 2019 - 2024. All rights reserved.