Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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 如何获取datetime.date对象的工作日_Python_Pandas_Numpy_Datetime_For Loop - Fatal编程技术网

Python 如何获取datetime.date对象的工作日

Python 如何获取datetime.date对象的工作日,python,pandas,numpy,datetime,for-loop,Python,Pandas,Numpy,Datetime,For Loop,在df中,如下所示: id timestamp temperature 27581 27822 2020-01-02 07:53:05.173 19.5 27582 27823 2020-01-02 07:53:05.273 20.0 27647 27888 2020-01-02 10:01:46.380 20.5 27648 27889 2020-01-02 10:01:46.480

在df中,如下所示:

        id      timestamp               temperature 
27581   27822   2020-01-02 07:53:05.173 19.5    
27582   27823   2020-01-02 07:53:05.273 20.0    
27647   27888   2020-01-02 10:01:46.380 20.5    
27648   27889   2020-01-02 10:01:46.480 21.0    
27649   27890   2020-01-02 10:01:48.463 21.5    
27650   27891   2020-01-02 10:01:48.563 22.0    
27711   27952   2020-01-02 10:32:19.897 21.5    
27712   27953   2020-01-02 10:32:19.997 21.0
27861   28102   2020-01-02 11:34:41.940 21.5    
...
在生成绘图的for循环中,我想在绘图标题内打印
date
的工作日
date
是一个datetime.date对象。但是我在格式化日期时出错了。我试过这样的方法,基于:

日期以
2020-01-01
格式显示日期,这很好,但工作日部分返回错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-56-6cc9c07f6879> in <module>()

---> 86   plt.title(date, date.strftime('%B'))
     87 
     88   number.append(np.count_nonzero(df2['events'][minLim:maxLim]))

2 frames
/usr/local/lib/python3.6/dist-packages/matplotlib/text.py in update(self, kwargs)
    174         # Update bbox last, as it depends on font properties.
    175         sentinel = object()  # bbox can be None, so use another sentinel.
--> 176         bbox = kwargs.pop("bbox", sentinel)
    177         super().update(kwargs)
    178         if bbox is not sentinel:

AttributeError: 'str' object has no attribute 'pop'
返回的

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-57-03b7529a410a> in <module>()
     82   number = []
     83   ax.autoscale() 
---> 84   year, month, day = (int(x) for x in date.split('-'))
     85   answer = datetime.date(year, month, day).weekday()
     86   plt.title(date, answer)

AttributeError: 'datetime.date' object has no attribute 'split'
其中返回了警告:

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:7: SettingWithCopyWarning:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
尽管已经打印了警告数据框
df_date
。但是如何使其从循环中同时返回日期和
工作日(例如
“2020-04-02,星期四”

我应该用这样的东西吗:

weekday = df_date.loc[date, df_date['Weekday']]

要在循环中获取相应的
date
工作日?

请使用DatetimeIndex的weekday属性。请参见链接页面底部的示例

范例

import pandas as pd
import matplotlib.pyplot as plt

data = [
    ["2020-01-02 10:01:48.563", "22.0"],
    ["2020-01-02 10:32:19.897", "21.5"],
    ["2020-01-02 10:32:19.997", "21.0"],
    ["2020-01-02 11:34:41.940", "21.5"],
]

df = pd.DataFrame(data)
df.columns = ["date", "temp"]

df["date"] = pd.to_datetime(df["date"])
df["weekday"] = df["date"].dt.weekday
df["day_name"] = df["date"].dt.day_name()

print(df)

for day_name in df["day_name"].unique():
    plt.figure()
    plt.plot(df["date"], df["temp"])
    plt.title(day_name)
plt.show()

                     date  temp  weekday  day_name
0 2020-01-02 10:01:48.563  22.0        3  Thursday
1 2020-01-02 10:32:19.897  21.5        3  Thursday
2 2020-01-02 10:32:19.997  21.0        3  Thursday
3 2020-01-02 11:34:41.940  21.5        3  Thursday
情节呢


更新04/04以回应评论

import pandas as pd
import matplotlib.pyplot as plt

data = [
["2020-01-02 10:01:48.563", "22.0"],
["2020-01-02 10:32:19.897", "21.5"],
["2020-01-02 10:32:19.997", "21.0"],
["2020-01-02 11:34:41.940", "21.5"],
]

df = pd.DataFrame(data)
df.columns = ["timestamp", "temp"]
df["timestamp"] = pd.to_datetime(df["timestamp"])

df['Date'] = df['timestamp'].dt.date
df.set_index(df['timestamp'], inplace=True)

df['Weekday'] = df.index.day_name() 

for date in df['Date'].unique():
  df_date = df[df['Date'] == date]

  plt.figure()
  plt.plot(df_date["timestamp"], df["temp"])
  plt.title("{}, {}".format(date, df_date["Weekday"].iloc[0]))
  plt.show()
请注意,这将为每个独特的日期生成一个绘图,我假设这就是您所追求的

对于上面的有限数据示例,这将生成绘图

Hi Hiho,在文档中声明“此方法在具有datetime值(使用dt访问器)或DatetimeIndex的两个系列上都可用。”但是
plt.title(date,date.dayofweek())
返回了
AttributeError:'datetime.date'对象没有属性'dayofweek'
@nilsinelabore添加了一个使用(其中一些)的示例你的数据来自上面。希望这显示了如何使用它。嗨,嗨,谢谢你的答案编辑。我试过你的密码。我认为它在系列中作为dataframe的一部分工作得很好,但我仍在努力将其插入Matplotlib标题中。我用
df[“weekday”]=df[“Date”].dt.weekday
创建了一个新列,并将标题部分更改为
plt.title(Date,df[“weekday]”)
,它返回
TypeError:pop()接受2个位置参数,但给出了3个位置参数。我想我不应该在标题上这么做?你知道什么是标题论点吗?如果你认为有必要,我可以上传完整的代码。非常感谢…@nilsinelabore,因为您将许多参数传递给plt.title,它只需要一个字符串值(即标题),因此您必须在标题中获取所需的特定工作日。我已经添加了一个情节的例子,我认为你在追求什么。嗨,你好,谢谢你的答复。实际上,我想在标题中同时包含日期和工作日,例如“2020-04-02,星期四”。你知道我如何调整我的代码来做到这一点吗?
import pandas as pd
import matplotlib.pyplot as plt

data = [
    ["2020-01-02 10:01:48.563", "22.0"],
    ["2020-01-02 10:32:19.897", "21.5"],
    ["2020-01-02 10:32:19.997", "21.0"],
    ["2020-01-02 11:34:41.940", "21.5"],
]

df = pd.DataFrame(data)
df.columns = ["date", "temp"]

df["date"] = pd.to_datetime(df["date"])
df["weekday"] = df["date"].dt.weekday
df["day_name"] = df["date"].dt.day_name()

print(df)

for day_name in df["day_name"].unique():
    plt.figure()
    plt.plot(df["date"], df["temp"])
    plt.title(day_name)
plt.show()
                     date  temp  weekday  day_name
0 2020-01-02 10:01:48.563  22.0        3  Thursday
1 2020-01-02 10:32:19.897  21.5        3  Thursday
2 2020-01-02 10:32:19.997  21.0        3  Thursday
3 2020-01-02 11:34:41.940  21.5        3  Thursday
import pandas as pd
import matplotlib.pyplot as plt

data = [
["2020-01-02 10:01:48.563", "22.0"],
["2020-01-02 10:32:19.897", "21.5"],
["2020-01-02 10:32:19.997", "21.0"],
["2020-01-02 11:34:41.940", "21.5"],
]

df = pd.DataFrame(data)
df.columns = ["timestamp", "temp"]
df["timestamp"] = pd.to_datetime(df["timestamp"])

df['Date'] = df['timestamp'].dt.date
df.set_index(df['timestamp'], inplace=True)

df['Weekday'] = df.index.day_name() 

for date in df['Date'].unique():
  df_date = df[df['Date'] == date]

  plt.figure()
  plt.plot(df_date["timestamp"], df["temp"])
  plt.title("{}, {}".format(date, df_date["Weekday"].iloc[0]))
  plt.show()