Pandas的日期范围

2024-04-20 13:51:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在和NumPy和dateutil战斗了几天后,我最近发现了令人惊叹的熊猫图书馆。我已经仔细阅读了文档和源代码,但是我不知道如何让date_range()在正确的断点处生成索引。

from datetime import date
import pandas as pd

start = date('2012-01-15')
end = date('2012-09-20')
# 'M' is month-end, instead I need same-day-of-month
date_range(start, end, freq='M')

我想要的:

2012-01-15
2012-02-15
2012-03-15
...
2012-09-15

我得到的是:

2012-01-31
2012-02-29
2012-03-31
...
2012-08-31

我需要一个月大小的数据块,用来表示一个月中的可变天数。这在dateutil.rrule中是可能的:

rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1)

难看,难以辨认,但它的工作。我怎么能和熊猫在一起?我玩过date_range()period_range()两种游戏,到目前为止都没有运气。

我的实际目标是使用groupbycrosstab和/或resample来计算每个时段的值,这些值基于该时段内各个条目的总和/平均值/etc。换言之,我希望从以下位置转换数据:

                total
2012-01-10 00:01    50
2012-01-15 01:01    55
2012-03-11 00:01    60
2012-04-28 00:01    80

#Hypothetical usage
dataframe.resample('total', how='sum', freq='M', start='2012-01-09', end='2012-04-15') 

                total
2012-01-09          105 # Values summed
2012-02-09          0   # Missing from dataframe
2012-03-09          60
2012-04-09          0   # Data past end date, not counted

考虑到熊猫起源于一种金融分析工具,我几乎可以肯定,有一种简单快捷的方法可以做到这一点。感谢帮助!


Tags: 数据fromimportdaterangestartendtotal
3条回答

freq='M'用于月末频率(请参见here)。但您可以使用.shift将其移动任意天数(或任何频率):

pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day)

试试看

date_range(start, end, freq=pd.DateOffset(months=1))

实际上没有“月日”频率(例如“DOMXX”和“DOM09”),但我看不出任何理由不添加一个。

http://github.com/pydata/pandas/issues/2289

我现在没有一个简单的解决方法,因为resample需要传递已知的频率规则。我认为应该对其进行扩充,以便能够将任何日期范围用作任意的bin边缘。只是时间和黑客。。。

相关问题 更多 >