【问题标题】:how to set datetime type index for weekly column in pandas dataframe如何在熊猫数据框中为每周列设置日期时间类型索引
【发布时间】:2020-12-27 06:21:08
【问题描述】:

我有如下数据:

date    product price   amount
201901  A   10  20
201902  A   10  20
201903  A   20  30
201904  C   40  50

此数据保存在 test.txt 文件中。 日期列作为周列给出,作为年份和周ID 的串联。我正在尝试使用给定的代码将日期列设置为索引:

import pandas as pd
import numpy as np
data=pd.read_csv("test.txt", sep="\t", parse_dates=['date'])

但它给出了一个错误。如何将日期列设置为日期时间类型的索引?

【问题讨论】:

  • 它给出了什么错误?您可以发布您的 test.txt 内容吗?

标签: python-3.x pandas dataframe date


【解决方案1】:

使用index_col参数设置index

data=pd.read_csv("test.txt", sep="\t", index_col=[0])

编辑:使用列名作为索引:

data=pd.read_csv("test.txt", sep="\t", index_col=['date'])

要将indexint 转换为date time,请执行以下操作:

data.index = pd.to_datetime(data.index, format='%Y%m')

【讨论】:

  • 非常感谢您的回复。有没有办法用列名来做到这一点?列的顺序可能会改变,所以使用列名对我来说更安全。
  • “日期”列被分配为 int。我正在尝试将它分配给 dateTimeIndex。请也考虑一下。谢谢。
  • @user3104352 如果要分配索引名称而不是整数,请尝试 data=pd.read_csv("test.txt", sep="\t", index_col=['date'])。您的日期列也是Year-Weekid 格式对吗?
  • 是的,我正在尝试获取 Year-Weekid 格式。但如果我使用这一行,data=pd.read_csv("test.txt", sep="\t", index_col=['date']),它会将 int 分配给日期索引列。
  • @user3104352 我已经根据您的 cmets 更新了我的答案。检查EDIT 部分。
【解决方案2】:

可能还有比这更简单的解决方案,首先使用apply,我将您的Year-Weekid 转换为Year-month-day 格式,然后只是简单地使用set_indexdate 作为索引列。

import pandas as pd

data ={
    'date' : [201901,201902,201903,201904,201905],
    'product' : ['A','A','A','C','C'],
    'price' : [10,10,10,20,20],
    'amount' : [20,20,30,50,60]
}


df = pd.DataFrame(data)

# str(x)+'1' converts to Year-WeekId-Weekday, so 1 represents `Monday` so 2019020 
# means 2019 Week2 Monday.
# If you want you can try with other formats too

df['date'] = df['date'].apply(lambda x: pd.to_datetime(str(x)+'1',format='%Y%W%w'))
df.set_index(['date'],inplace=True)
df

编辑:

要查看Year-WeekID 格式的日期时间,您可以按如下方式设置数据框的样式,但是如果您将date 设置为索引列,则后面的代码将无法工作。还要记住以下代码只是应用了一些样式,因此仅用于显示目的,在内部它将保留为日期时间对象。

df['date'] = df['date'].apply(lambda x: pd.to_datetime(str(x)+'1',format='%Y%W%w'))
style_format = {'date':'{:%Y%W}'}
df.style.format(style_format)

【讨论】:

  • 非常感谢您的回复,但我需要保持“Year-WeekId”的格式。是否有任何解决方案可以在保持格式的同时将日期时间类型设置为日期列?
  • @user3104352 在我的解决方案中,列类型为datetime,我不知道Year-Week 格式一般datetimeYYYYMMDD HH:MM:SS 类型的格式。但是,您可以在处理值时轻松访问周和年,因为该列采用 datetime 格式。 (df.index).week(df.index).year 之类的东西在访问星期和年份时应该可以工作。
  • @user3104352 我已经编辑了我的答案,请检查一下。
【解决方案3】:

你也可以使用date_parser参数:

import pandas as pd
from io import StringIO
from datetime import datetime

dateparse = lambda x: datetime.strptime(x, '%Y%m')

inputtxt = StringIO("""date    product price   amount
201901  A   10  20
201902  A   10  20
201903  A   20  30
201904  C   40  50""")

df = pd.read_csv(inputtxt, sep='\s+', parse_dates=['date'], date_parser=dateparse)
df.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype         
---  ------   --------------  -----         
 0   date     4 non-null      datetime64[ns]
 1   product  4 non-null      object        
 2   price    4 non-null      int64         
 3   amount   4 non-null      int64         
dtypes: datetime64[ns](1), int64(2), object(1)
memory usage: 256.0+ bytes

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2019-02-11
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多