【问题标题】:Pandas date_range and leap years熊猫 date_range 和闰年
【发布时间】:2014-01-06 20:17:14
【问题描述】:

运行此代码时:

a = pd.date_range("1959-12-09 00:00:00", "2013-12-09 12:00:00", freq = "365D6H")
weekDays = [dt.datetime.weekday(d) for d in a]
df = pd.DataFrame({"Date": a, "Jour": weekDays})
df.head(6)

我明白了:

0 1959-12-09 00:00:00     2
1 1960-12-08 06:00:00     3   * 
2 1961-12-08 12:00:00     4
3 1962-12-08 18:00:00     5
4 1963-12-09 00:00:00     0
5 1964-12-08 06:00:00     1   *
6 1965-12-08 12:00:00     2

还有闰年的问题。 尽管有闰年,我怎么能在日期之间恰好有一个日历年?

【问题讨论】:

  • 您想在年份数字上加上六个小时?还是您只想将年份增加一?如果您使用freq='1A',我会说日历年的定义是正确的...但也许您可以详细说明?
  • 我增加了六个小时,希望每年都有确切的生日(包括闰年),因为“365D”我得到了错误的结果,一年是 365.25...“1A”我得到了每个确切的年份,但在 12 月 31 日,这不是感兴趣的生日!

标签: python pandas date-range leap-year


【解决方案1】:

您可以使用列表理解来创建它,而不是使用date_range

In [11]: pd.to_datetime(["%s-12-09 %s:00:00" % (y, (6 * h) % 24)
                             for h, y in enumerate(xrange(1959, 2014))])
Out[11]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[1959-12-09 00:00:00, ..., 2013-12-09 12:00:00]
Length: 55, Freq: None, Timezone: None

频率为无,因为这不是常规频率...如果您尝试添加一个 numpy 年份和一个 numpy 小时,您会看到:

In [21]: np.timedelta64(1, 'Y') + np.timedelta64(6, 'h')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-6a7f3e5b3315> in <module>()
----> 1 np.timedelta64(1, 'Y') + np.timedelta64(6, 'h')

TypeError: Cannot get a common metadata divisor for NumPy datetime metadata [Y] and [h] because they have incompatible nonlinear base time units

【讨论】:

  • 谢谢,您的回答是正确的,但我想知道为什么 pandas 在我的示例中没有考虑闰年。使用不同的开始日期(例如:“1941-01-04”)我得到正确答案,但不是“1959-12-09”。
猜你喜欢
  • 2016-08-14
  • 2020-07-21
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
相关资源
最近更新 更多