我获得了每月时间跟踪预订的数据。由于没有周末和国定假日的预订,因此某些天缺少数据。现在,我正在扩展数据,以使其包括该月的所有天,但仅包含空数据。这是我解决的方法。我想知道是否有更优雅的方法来实现相同的目的?
为列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 |
+----+---------------------+--------+-------+----------+-----------------+---------+
所以,那怎么了?没什么,结果很好。但是我想知道是否有更好的方法来创建该月的索引,然后如何将该索引与原始数据结合起来?有什么建议么?只是想学习并变得更好;)
如果DatetimeIndex
的所有值都是唯一的,则可以在此处使用DataFrame.reindex
-同样,对于新的DataFrame.reindex
的开始和结束,首先将第一个值转换为月份期间,然后使用DatetimeIndex
:
Period.to_timestamp