删除pandas中DateTime索引的时间部分

时间:2018-06-13 20:02:14

标签: python pandas

当我通过他们的API查询服务以获取每日数据时,他们会投入一个时间部分,该部分等于查询的生成时间。所以当我在14:54:36调用函数时,我的pandas数据框看起来像这样 -

2018-05-16 14:54:36  1024.75  1008.25      ...        39221        242897
2018-05-17 14:54:36  1017.00  1002.00      ...        35361        241132
2018-05-18 14:54:36  1015.75  1002.75      ...        49090        242938
2018-05-21 14:54:36  1034.50  1020.75      ...        56950        243316
2018-05-22 14:54:36  1043.75  1028.50      ...        49724        247874
2018-05-23 14:54:36  1049.00  1036.25      ...        46256        253609
2018-05-24 14:54:36  1059.75  1047.00      ...        65352        259617

由于这是每日数据,因此时间部分无用。当我这样做时:

data = pd.read_csv(StringIO(data), index_col=0, header=None,names=['High','Low','Open','Close','Volume','OpenInterest'])
data.index = pd.to_datetime(data.index,format="%Y-%m-%d")

格式似乎不起作用。 DateTime索引仍包含时间。知道如何删除时间部分吗?

3 个答案:

答案 0 :(得分:5)

使用date属性:

df.index = df.index.date

示例:

>>> df = pd.DataFrame([1, 2, 3, 4], index=pd.date_range('2018', periods=4, freq='H'))
>>> df.index = df.index.date
>>> df
            0
2018-01-01  1
2018-01-01  2
2018-01-01  3
2018-01-01  4

注意:这会让你在Pandas中获得object dtype。所有属性均为here。它在技术上是一组本机Python datetime.date对象。请参阅ALollz的答案,以保持dtype类似日期时间。

答案 1 :(得分:3)

还可以选择维护日期时间功能,但只需将时间部分设置为00:00:00

df.index = df.index.normalize()
import pandas as pd
df = pd.DataFrame([1, 2, 3, 4], index=pd.date_range('2018', periods=4, freq='H'))

df.index = df.index.normalize()

df现在是:

            0
2018-01-01  1
2018-01-01  2
2018-01-01  3
2018-01-01  4

查看索引:

df.index
#DatetimeIndex(['2018-01-01', '2018-01-01', '2018-01-01', '2018-01-01'], dtype='datetime64[ns]', freq=None)

值为Timestamps:

df.index[0]
#Timestamp('2018-01-01 00:00:00')

答案 2 :(得分:0)

您可以使用以下简单函数来控制Index对象:

def set_date_range(start_date, number_of_periods, frequency):
            date_range = pd.date_range(start= start_date, periods=number_of_periods, freq=frequency)

            for date in date_range:
                print(date)
            print()

set_date_range('1/1/2018', 5, "MS")

看到下面带有注释的行,它将删除时间部分

def set_date_range(start_date, number_of_periods, frequency):
            date_range = pd.date_range(start= start_date, periods=number_of_periods, freq=frequency)

            date_range = date_range.date # ASSIGNING THIS GETS RID OF THE TIME PORTION

            for date in date_range:
                print(date)
            print()

set_date_range('1/1/2018', 5, "MS")