首页 > 解决方案 > 似乎无法将时间戳与 Python 中创建的日期范围相匹配

问题描述

我对编码和尝试将日期时间列与 Pandas 中创建的日期范围合并相对较新。

我正在尝试将已放入 variable的 datetime 列StartDate(来自 DataFrame )与创建的 DatetimeIndex进行匹配,以便我有一个时间序列。energystart_datestimeline

这看起来像这样:

In [1]: start_dates
Out[1]:
0        2016-06-25 00:00:00
1        2016-06-26 00:00:00
2        2016-06-27 00:00:00

rates是一个带有一系列费率的 DataFrame,我试图通过附加到以下内容来提供特定时间的费率信息start_dates

In [2]: rates
Out[2]:
   Rate1
0  4.8
1  5.9
2  2.6

我试图将时间戳start_datestimeline.

我已经尝试了所有方法,包括加入、合并、插入、连接、追加和分配,但我无法让两者合并。

我最近的尝试是:

timeline = pd.date_range('2007-03', '2022-06') #231 months
timeline = timeline.to_frame([timeline])

start_dates = energy.loc[:, 'StartDate']
start_dates = datetime.datetime.strptime(first_thous[:, 'StartDate'], '%Y-%m-%d').date()

rates = energy.loc[:, 'Rate1']
start_dates.append(rates)

timeline = timeline.reset_index(drop = True)
timeline.join(start_dates, how = 'inner')
print(timeline)

但是,虽然没有错误,但这些列似乎没有将任何列附加或连接在一起,所以我实际上无法说出它为什么不起作用。

这里发生了什么?

预期的结果是:

In [3]: timeline
Out[3]:
             Rate1
0 2016-06-25 4.8
1 2016-06-26 5.9
2 2016-06-27 2.6

标签: pythonpandasdatetime

解决方案


您可以使用:

energy = pd.DataFrame({'Rate1':[4.8,5.9,2.6],
                       'StartDate':['2007-02-28 00:00:00',
                                    '2007-03-01 00:00:00',
                                    '2007-03-02 00:00:00']})
print (energy)
   Rate1            StartDate
0    4.8  2007-02-28 00:00:00
1    5.9  2007-03-01 00:00:00
2    2.6  2007-03-02 00:00:00


timeline = pd.date_range('2007-03', '2022-06')
print (timeline)
DatetimeIndex(['2007-03-01', '2007-03-02', '2007-03-03', '2007-03-04',
               '2007-03-05', '2007-03-06', '2007-03-07', '2007-03-08',
               '2007-03-09', '2007-03-10',
               ...
               '2022-05-23', '2022-05-24', '2022-05-25', '2022-05-26',
               '2022-05-27', '2022-05-28', '2022-05-29', '2022-05-30',
               '2022-05-31', '2022-06-01'],
              dtype='datetime64[ns]', length=5572, freq='D')

不要选择列来分隔系列或数据帧。只需转换列StartDate to_datetime,然后通过布尔索引isin过滤:

energy['StartDate'] = pd.to_datetime(energy['StartDate'])
df = energy[energy['StartDate'].isin(timeline)]
print (df)
   Rate1  StartDate
1    5.9 2007-03-01
2    2.6 2007-03-02

另一种解决方案:

energy['StartDate'] = pd.to_datetime(energy['StartDate'])
df = pd.DataFrame({'StartDate':timeline}).merge(energy)
print (df)
   StartDate  Rate1
0 2007-03-01    5.9
1 2007-03-02    2.6

推荐阅读