Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何为数据框列标签设置日期时间格式?_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 3.x 如何为数据框列标签设置日期时间格式?

Python 3.x 如何为数据框列标签设置日期时间格式?,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,上面是读取excel文件后的列标签。读取excel后,df变量中有10列,列标签中的7列是日期 我的输入数据集是一个每天都在变化的excel文件,我想自动更新它。在excel中,一些列标签是日期,如2020年11月11日,2020年11月12日,但在读取excel后,它会变成2020-11-11 00:00:00,2020-11-12 00:00:00。在pd读取excel时,我想将列标签保留为2020年11月11日,2020年11月12日。如果可能,请读取excel,否则我需要稍后转换 我对p

上面是读取excel文件后的列标签。读取excel后,df变量中有10列,列标签中的7列是日期

我的输入数据集是一个每天都在变化的excel文件,我想自动更新它。在excel中,一些列标签是日期,如
2020年11月11日
2020年11月12日
,但在读取excel后,它会变成
2020-11-11 00:00:00
2020-11-12 00:00:00
。在pd读取excel时,我想将列标签保留为
2020年11月11日
2020年11月12日
。如果可能,请读取excel,否则我需要稍后转换

我对python非常陌生。期待您的支持
感谢已经站出来与我合作的人,datetime模块的strftime是您需要的功能:

如果datetime是datetime对象,则可以

IPNI_RNC PATHID 2020-11-11 00:00:00 2020-11-12 00:00:00 2020-11-13 00:00:00 2020-11-14 00:00:00 2020-11-15 00:00:00 2020-11-16 00:00:00 2020-11-17 00:00:00 Last Day Violation Count
例如:

datetime.strftime("%d-%b-%Y")
datetime_cols_list = ['datetime_col1', 'datetime_col2', ...]
for col in dataframe.columns:
    if col in datetime_cols_list:
        dataframe[col] = dataframe[col].apply(lambda x: x.strftime("%d-%b-%Y"))
要将函数应用于某些数据帧列,请使用:

>>> from datetime import datetime
>>> timestamp = 1528797322
>>> date_time = datetime.fromtimestamp(timestamp)
>>> print(date_time) 
2018-06-12 11:55:22
>>> print(date_time.strftime("%d-%b-%Y"))
12-Jun-2018
我相信这可以通过多种方式在熊猫身上实现,这正是我脑子里想出来的

例如:

datetime.strftime("%d-%b-%Y")
datetime_cols_list = ['datetime_col1', 'datetime_col2', ...]
for col in dataframe.columns:
    if col in datetime_cols_list:
        dataframe[col] = dataframe[col].apply(lambda x: x.strftime("%d-%b-%Y"))

当然,您可以使用标准的python方法来解析日期值,但我不推荐这样做,因为这样您最终会得到python datetime对象,而不是日期的熊猫表示。这意味着,它会占用更多的空间,可能没有那么高效,您不能使用pandas方法访问,例如,年份。我会告诉你我下面的意思。 如果您想避免列名的命名问题,您可能希望尝试阻止pandas自动分配名称,并将第一行作为数据读取以自动修复它(请参阅下面关于如何执行此操作的部分)

类型转换部分:

import pandas as pd
import numpy as np

np.random.seed(0)
# generate some random datetime values
rng = pd.date_range('2015-02-24', periods=5, freq='T')
other_dt_col = rng = pd.date_range('2016-02-24', periods=5, freq='T')
df = pd.DataFrame({ 'Date': rng, 'Date2': other_dt_col,'Val': np.random.randn(len(rng)) }) 

print (df)
# Output:
#   Date                Date2                Val
# 0 2016-02-24 00:00:00 2016-02-24 00:00:00  1.764052
# 1 2016-02-24 00:01:00 2016-02-24 00:01:00  0.400157
# 2 2016-02-24 00:02:00 2016-02-24 00:02:00  0.978738
# 3 2016-02-24 00:03:00 2016-02-24 00:03:00  2.240893
# 4 2016-02-24 00:04:00 2016-02-24 00:04:00  1.867558

datetime_cols_list = ['Date', 'Date2']
for col in df.columns:
    if col in datetime_cols_list:
        df[col] = df[col].apply(lambda x: x.strftime("%d-%b-%Y"))

print (df)
# Output:
#    Date         Date2        Val
# 0  24-Feb-2016  24-Feb-2016  1.764052
# 1  24-Feb-2016  24-Feb-2016  0.400157
# 2  24-Feb-2016  24-Feb-2016  0.978738
# 3  24-Feb-2016  24-Feb-2016  2.240893
# 4  24-Feb-2016  24-Feb-2016  1.867558
输出为:

# create a test setup with a small dataframe
import pandas as pd
from datetime import date, datetime, timedelta
df= pd.DataFrame(dict(id=range(10), date_string=[str(datetime.now()+ timedelta(days=d)) for d in range(10)]))

# test the python way:
df['date_val_python']= df['date_string'].map(lambda dt: str(dt))

# use the pandas way: (btw. if you want to explicitely 
# specify the format, you can use the format= keyword)
df['date_val_pandas']= pd.to_datetime(df['date_string'])
df.dtypes
正如您所看到的,
date\u val
具有类型
object
,这是因为它包含类
datetime
的python对象,而
date\u val\u pandas
使用pandas的内部datetime表示。您现在可以尝试:

id                          int64
date_string                object
date_val_python            object
date_val_pandas    datetime64[ns]
dtype: object
有关更多详细信息,请参阅熊猫文档

列命名部分:

df['date_val_pandas'].dt.year
# this will return a series with the year part of the date

df['date_val_python'].dt.year
# this will result in the following error:
AttributeError: Can only use .dt accessor with datetimelike values

如果您的列标题存储为通常的日期,这是有效的,我认为这是正确的,因为您在导入它们后会得到一个时间段。

您好,请检查第一行好吗?看起来它需要一些重新格式化,如果你想将它作为一个行列表,你可以使用{}按钮将它重新格式化为代码。使用
.dt.strftime(“%d-%b-%Y”)
而不是
。apply(lambda x:x.strftime(“%d-%b-%Y”)
你所说的
.dt
?@liakoyras,谢谢,我想现在应该包括问题的各个方面。@jottbe,非常感谢,现在效果很好。不客气。如果你愿意,那么你可以把它标记为答案。非常感谢!