我有两个日期时间索引的数据框。一个缺少一些这样的日期时间 ( df1) 而另一个是完整的(具有常规时间戳,在本系列中没有任何间隙)并且充满了NaN's ( df2)。
我试图从DF1值匹配的指数df2,带馅NaN的,其中这种datetimeindex不存在的df1。
例子:
In [51]: df1
Out [51]: value
2015-01-01 14:00:00 20
2015-01-01 15:00:00 29
2015-01-01 16:00:00 41
2015-01-01 17:00:00 43
2015-01-01 18:00:00 26
2015-01-01 19:00:00 20
2015-01-01 20:00:00 31
2015-01-01 21:00:00 35
2015-01-01 22:00:00 39
2015-01-01 23:00:00 17
2015-03-01 00:00:00 6
2015-03-01 01:00:00 37
2015-03-01 02:00:00 56
2015-03-01 03:00:00 12
2015-03-01 04:00:00 41
2015-03-01 05:00:00 31
... ...
2018-12-25 23:00:00 41
<34843 …Run Code Online (Sandbox Code Playgroud) 在DateFrame按年份或月份对Pandas 对象进行分组并返回DateFrame具有新索引的新对象时,我需要一些指导。到目前为止,这是我的代码。groupby按预期工作。
从.csv文件加载数据,将“日期”解析为日期格式(finance.yahoo.com的历史股票报价)
In [23]: import pandas as pd
file = pd.read_csv("sdf.de.csv", parse_dates=['Date'])
file.head(2)
Out[23]:
Date Open High Low Close Volume Adj Close
0 2016-02-16 18.650 18.70 17.940 18.16 1720800 17.0600
1 2016-02-15 18.295 18.64 18.065 18.50 1463500 17.3794
Run Code Online (Sandbox Code Playgroud)
将“日期”升序排序文件,并将索引设置为 Date
In [24]: daily = file.sort_values(by='Date').set_index('Date')
daily.head()
Out[24]:
Open High Low Close Volume Adj Close
Date
2000-01-03 14.20 14.50 14.15 14.40 277400 2.7916
2000-01-04 14.29 14.30 13.90 14.15 109200 2.7431
Run Code Online (Sandbox Code Playgroud)
每月分组
我将对apply()这些组进行附加处理,这将压缩特定组的数据,例如,找到 …
pandas允许对时间索引进行冷切片.例如,我可以df通过以下方式切割2012年1月至2012年3月的数据帧:
df['2012-01':'2012-03']
Run Code Online (Sandbox Code Playgroud)
但是,我有一个df带有multiindex 的数据帧,其中时间索引是第二级.看起来像:
A B C D E
a 2001-01-31 0.864841 0.789273 0.370031 0.448256 0.178515
2001-02-28 0.991861 0.079215 0.900788 0.666178 0.693887
2001-03-31 0.016674 0.855109 0.984115 0.436574 0.480339
2001-04-30 0.120924 0.046013 0.659807 0.210534 0.694029
2001-05-31 0.788149 0.296244 0.478201 0.845042 0.437814
b 2001-01-31 0.497646 0.349958 0.223227 0.812331 0.975012
2001-02-28 0.542572 0.472267 0.276186 0.970909 0.138683
2001-03-31 0.960813 0.666942 0.069349 0.282741 0.127992
2001-04-30 0.491422 0.678742 0.048784 0.612312 0.713472
2001-05-31 0.718721 0.504403 0.069047 0.253682 0.836386
Run Code Online (Sandbox Code Playgroud)
我仍然可以通过以下方式在任何特定级别使用上述方法切片:
df.loc['a']['2012-01':'2012-03']
Run Code Online (Sandbox Code Playgroud)
但这只是为了level0 == …
我有时间序列数据,我想根据小时、分钟或秒进行拆分。这通常是用户定义的。我想知道如何做到这一点。
例如,请考虑以下情况:
test = pd.DataFrame({'TIME': pd.date_range(start='2016-09-30',
freq='600s', periods=20)})
test['X'] = np.arange(20)
Run Code Online (Sandbox Code Playgroud)
输出是:
TIME X
0 2016-09-30 00:00:00 0
1 2016-09-30 00:10:00 1
2 2016-09-30 00:20:00 2
3 2016-09-30 00:30:00 3
4 2016-09-30 00:40:00 4
5 2016-09-30 00:50:00 5
6 2016-09-30 01:00:00 6
7 2016-09-30 01:10:00 7
8 2016-09-30 01:20:00 8
9 2016-09-30 01:30:00 9
10 2016-09-30 01:40:00 10
11 2016-09-30 01:50:00 11
12 2016-09-30 02:00:00 12
13 2016-09-30 02:10:00 13
14 2016-09-30 02:20:00 14
15 2016-09-30 02:30:00 15
16 2016-09-30 …Run Code Online (Sandbox Code Playgroud) 我正在生成一个空数据框,其中包含一系列日期作为索引.数据将在稍后添加到数据框中.
cbd=pd.date_range(start=pd.datetime(2017,01,02),end=pd.datetime(2017,01,30),period=1)
df = pd.DataFrame(data=None,columns=['Test1','Test2'],index=cbd)
df.head()
Test1 Test2
2017-01-02 NaN NaN
2017-01-03 NaN NaN
2017-01-04 NaN NaN
2017-01-05 NaN NaN
2017-01-06 NaN NaN
Run Code Online (Sandbox Code Playgroud)
一些切片方法似乎不起作用.以下返回KeyError:
df['2017-01-02']
Run Code Online (Sandbox Code Playgroud)
但是,以下任何工作:
df['2017-01-02':'2017-01-02']
df.loc['2017-01-02']
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?为什么第一个切片不返回结果?
我有一个pandas DataFrame DateTimeIndex:
A B
2016-04-25 18:50:06 440.967796 201.049600
2016-04-25 18:50:13 441.054995 200.767034
2016-04-25 18:50:20 441.142337 200.484475
...
2016-07-27 18:50:06 440.967796 201.049600
2016-07-27 18:50:13 441.054995 200.767034
2016-07-27 18:50:20 441.142337 200.484475
Run Code Online (Sandbox Code Playgroud)
我想yyyy-mm-dd使用日期列表提取给定日期的所有数据:['2016-04-25','2016-04-28',...]
我尝试了以下方法:
df[df.index.isin(['2016-04-25', '2016-04-26'])]
Empty DataFrame
Run Code Online (Sandbox Code Playgroud)
我想检索此列表中给出的日期的所有数据(一整天的数据)
我有一个日期不完整的 DataFrame,我只需要每个月最后一天可用的日期/行。我尝试使用 TimeGrouper 并获取.last()每个组。
import pandas as pd
idx = [pd.datetime(2016,2,1),pd.datetime(2017,1,20),pd.datetime(2017,2,1),pd.datetime(2017,2,27)]
df = pd.DataFrame([1,2,3,4],index=idx)
df
0
2016-02-01 1
2017-01-20 2
2017-02-01 3
2017-02-27 4
Run Code Online (Sandbox Code Playgroud)
期待:
df_eom
0
2016-02-01 1
2017-01-20 2
2017-02-27 4
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个:
df_eom = df.groupby(pd.TimeGrouper(freq='1M')).last()
df_eom
0
2016-02-29 1.0
2016-03-31 NaN
2016-04-30 NaN
2016-05-31 NaN
2016-06-30 NaN
2016-07-31 NaN
2016-08-31 NaN
2016-09-30 NaN
2016-10-31 NaN
2016-11-30 NaN
2016-12-31 NaN
2017-01-31 2.0
2017-02-28 4.0
Run Code Online (Sandbox Code Playgroud)
它不仅创建了不在 df 中的日期,而且还更改了 df 第一行和最后一行的索引。我使用 TimeGrouper 错了吗?
新版pandas不推荐使用TimeGrouper,因此我们应该使用常规的Grouper。
旧代码:
df['column_name'].groupby(pd.TimeGrouper("M")).mean().plot()
Run Code Online (Sandbox Code Playgroud)
在旧版本的熊猫中工作正常。但是,没有:
df.groupby(pd.Grouper(key='column_name', freq="M")).mean().plot()
df['column_name'].groupby(pd.Grouper(freq="M")).mean().plot()
Run Code Online (Sandbox Code Playgroud)
在新版本中可用。认为钥匙丢失,或者熊猫抱怨:
Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Float64Index'
Run Code Online (Sandbox Code Playgroud)
import pandas as pd
df = pd.DataFrame({'column_name':['2017-01-01', '2017-01-02'],
'column_value':[1,3]})
df
df.index = pd.DatetimeIndex(df.column_name)
df.index
# old version
df['column_value'].groupby(pd.TimeGrouper("M")).mean().plot()
# new version
df.groupby(pd.Grouper(key='column_value', freq="M")).mean().plot()
Run Code Online (Sandbox Code Playgroud) datetime有没有办法直接获取a 中某个元素的索引DateTimeIndex?
我有以下玩具示例代码,在将其转换DateTimeIndex为list.
import pandas as pd
import datetime
year = 2020
minutesStep = 10
dateTimeStr = "2020-01-01 00:40:00"
datesTimes = pd.date_range(start='1/1/'+str(year), end='1/1/'+str(year+1), freq=str(minutesStep)+'min')
dateTimeObj = datetime.datetime.strptime(dateTimeStr, '%Y-%m-%d %H:%M:%S')
l = datesTimes.tolist()
i = l.index(dateTimeObj)
print i
print datesTimes[i]
Run Code Online (Sandbox Code Playgroud)
这输出了预期的内容:
>>>
4
2020-01-01 00:40:00
Run Code Online (Sandbox Code Playgroud)
不过我想直接从DateTimeIndex. 那可能吗?
我正在尝试将熊猫的DatetimeIndex(或Timestamp)四舍五入到最近的分钟,但是Timestamps为30秒时出现了问题-有些向上舍入,有些向下舍入(这似乎是交替的)。
有什么建议可以解决此问题,以使30s总是四舍五入吗?
>>> pd.Timestamp(2019,6,1,6,57,30).round('1T')
Timestamp('2019-06-01 06:58:00')
>>> pd.Timestamp(2019,6,1,6,58,30).round('1T')
Timestamp('2019-06-01 06:58:00')
Run Code Online (Sandbox Code Playgroud)
最高结果看起来不错,其中57m 30s会四舍五入为58m,但是我希望最低结果会舍入到59m-不减少到58m。
datetimeindex ×10
pandas ×10
python ×9
dataframe ×2
gaps-in-data ×1
grouping ×1
multi-index ×1
reindex ×1