【问题标题】:Can't seem to match a timestamp to created date range in Python似乎无法将时间戳与 Python 中创建的日期范围相匹配
【发布时间】:2021-07-25 00:13:17
【问题描述】:

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

我正在尝试将已放入变量 start_dates 的日期时间列 StartDate(来自 DataFrame energy)与创建的名为 timeline 的 DatetimeIndex 相匹配,以便我有一个时间序列。

看起来是这样的:

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_dates 中的时间戳与timeline 中的日期范围相匹配。

我已经尝试了所有的方法,包括join、merge、insert、concat、append和assign,但我无法让两者合并。

我最近的尝试是:

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

【问题讨论】:

  • 这可能有助于人们试图回答说这是使用熊猫
  • @Bushman 谢谢,永远忘记这一点。
  • 您可以添加一些示例数据和预期输出吗?我认为how to provide a great pandas example 应该有所帮助
  • @jezrael 谢谢!。也试图提供具有预期输出的样本数据。这有意义吗?

标签: python pandas datetime


【解决方案1】:

你可以使用:

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')

不要选择列来分隔 Series 或 DataFrame。只需转换列StartDateto_datetime,然后用isin过滤Boolean indexing

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

【讨论】:

  • 也许我的问题不够清楚,但唯一的问题是 DataFrame energy 具有将 Rate1 关联到特定索引的开始日期,如果只是创建我自己的时间线,该索引将会丢失。
  • 简而言之,能量有许多时间间隔,我试图在时间序列中创建它们。其中这个问题只是创建开始日期的第一步。抱歉,如果这没有多大意义,我只做了一个月,正在努力解释我想要做什么。
  • 谢谢,看起来它可以工作。剩下的唯一问题是能量中的RateStartDate 有超过一百万行,因此我需要一些东西来从这两者创建新的DataFrame。尝试后,我似乎无法将 energy 中的多个列添加到新变量中。
  • @geds133 - 很难知道是否有百万行。添加了新的解决方案,但也许这里最好使用一些数据库,如 sqlite 并在那里合并以获得更好的性能。
  • 我认为您可能是对的,因为energy 还有 108 个包含不同数据的其他列。我将评估其他选项。感谢您花时间尝试解决我的问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 2015-09-17
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多