【问题标题】:Remove time portion of DateTime index in pandas删除 Pandas 中 DateTime 索引的时间部分
【发布时间】:2018-06-13 20:02:14
【问题描述】:

当我通过他们的 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 索引仍然包含时间。知道如何删除时间部分吗?

【问题讨论】:

  • df.index = df.index.values.astype('M8[D]') ?

标签: python pandas


【解决方案1】:

使用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 datetime-like。

【讨论】:

  • 是的——正如我在答案@ALollz 中提到的那样。虽然,从技术上讲,它是 python datetime.date 对象的 NumPy 数组。
  • 如果您想将数据作为时间序列来处理,我会公平地说更喜欢@ALollz 的答案。上面的这个答案真的是关于格式化,就像df.index.strftime('%Y-%m-%d'),你似乎在问题中得到了解决。
  • 我第二个@BradSolomon。使用df.index.strftime('%Y-%m-%d') 是获取任何您喜欢的日期对象格式的好方法。
【解决方案2】:

您可以使用normalize 维护日期时间功能并将时间部分设置为 00:00:00。

df.index = df.index.normalize()

# For non-Index datetime64[ns] dtype columns you use the `.dt` accessor:
# df['column'] = df['column'].dt.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()

print(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)

并且值是时间戳:

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

【讨论】:

    【解决方案3】:

    您可以使用如下简单的函数来控制您的 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")
    

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2020-06-27
      相关资源
      最近更新 更多