将 pandas 个数据框日期范围扩展到单独的行
Expand pandas dataframe date ranges to individual rows
我必须根据开始日期和结束日期将 pandas 数据框扩展到单独的行中。
原始数据框如下
ORIGINAL DATAFRAME
我的最终数据框应该在个人的开始日期和结束日期之间的每一天重复 rows.The 结果需要为每个日期扩展,而其他列除了 'startdate' 和 'enddate'被保留。
例如,开始日期 = 01-Jan-20 和结束日期 15-Jan-20 的第一行应扩展为 15 个单独的行,代表系列中的一个日期,如示例结果数据帧所示:
EXPECTED RESULTANT DATAFRAME
我尝试使用 itertuples 的解决方案来迭代数据框并将范围划分为各个日期,但是当数据框的大小很大时,解决方案很慢。
非常感谢对此的任何最佳解决方案。
使用pandas.date_range
in a list comprehension ,then use DataFrame.explode
(对于explode
方法,您至少需要使用pandas v 0.25.0
):
# Minimal example setup
df = pd.DataFrame({
'TRIPNAME': ['HIGHSEASON', 'LOWSEASON', 'MEDSEASON'],
'TRIPCAT': ['H', 'L', 'M'],
'STARTDATE' : ['01JAN20', '16SEP20', '29JAN20'],
'ENDDATE': ['15JAN20', '30NOV20', '19JUL20'],
'FARE': [345, 280, 250]
})
df['DATE'] = [pd.date_range(s, e, freq='d') for s, e in
zip(pd.to_datetime(df['STARTDATE']),
pd.to_datetime(df['ENDDATE']))]
df = df.explode('DATE').drop(['STARTDATE', 'ENDDATE'], axis=1)
print(df)
[出局]
TRIPNAME TRIPCAT FARE DATE
0 HIGHSEASON H 345 2020-01-01
0 HIGHSEASON H 345 2020-01-02
0 HIGHSEASON H 345 2020-01-03
0 HIGHSEASON H 345 2020-01-04
0 HIGHSEASON H 345 2020-01-05
.. ... ... ... ...
2 MEDSEASON M 250 2020-07-15
2 MEDSEASON M 250 2020-07-16
2 MEDSEASON M 250 2020-07-17
2 MEDSEASON M 250 2020-07-18
2 MEDSEASON M 250 2020-07-19
[264 rows x 4 columns]
我必须根据开始日期和结束日期将 pandas 数据框扩展到单独的行中。
原始数据框如下
ORIGINAL DATAFRAME
我的最终数据框应该在个人的开始日期和结束日期之间的每一天重复 rows.The 结果需要为每个日期扩展,而其他列除了 'startdate' 和 'enddate'被保留。
例如,开始日期 = 01-Jan-20 和结束日期 15-Jan-20 的第一行应扩展为 15 个单独的行,代表系列中的一个日期,如示例结果数据帧所示:
EXPECTED RESULTANT DATAFRAME
我尝试使用 itertuples 的解决方案来迭代数据框并将范围划分为各个日期,但是当数据框的大小很大时,解决方案很慢。
非常感谢对此的任何最佳解决方案。
使用pandas.date_range
in a list comprehension ,then use DataFrame.explode
(对于explode
方法,您至少需要使用pandas v 0.25.0
):
# Minimal example setup
df = pd.DataFrame({
'TRIPNAME': ['HIGHSEASON', 'LOWSEASON', 'MEDSEASON'],
'TRIPCAT': ['H', 'L', 'M'],
'STARTDATE' : ['01JAN20', '16SEP20', '29JAN20'],
'ENDDATE': ['15JAN20', '30NOV20', '19JUL20'],
'FARE': [345, 280, 250]
})
df['DATE'] = [pd.date_range(s, e, freq='d') for s, e in
zip(pd.to_datetime(df['STARTDATE']),
pd.to_datetime(df['ENDDATE']))]
df = df.explode('DATE').drop(['STARTDATE', 'ENDDATE'], axis=1)
print(df)
[出局]
TRIPNAME TRIPCAT FARE DATE
0 HIGHSEASON H 345 2020-01-01
0 HIGHSEASON H 345 2020-01-02
0 HIGHSEASON H 345 2020-01-03
0 HIGHSEASON H 345 2020-01-04
0 HIGHSEASON H 345 2020-01-05
.. ... ... ... ...
2 MEDSEASON M 250 2020-07-15
2 MEDSEASON M 250 2020-07-16
2 MEDSEASON M 250 2020-07-17
2 MEDSEASON M 250 2020-07-18
2 MEDSEASON M 250 2020-07-19
[264 rows x 4 columns]